1.引用计数法
- 引用计数在cocos2dx里已经比较熟悉了,要注意的一个点就是循环引用的问题,如果有两个对象相互持有对方的引用,但是已经没有其他对象持有这两个对象的引用,那么就会出现这两个引用的引用计数分别不为0,但是其实实际上已经无法被外部引用了,就是已经死亡了。
2.可达性分析算法
- 所谓可达性分析算法,就是通过一直存在的对象为起点(GC Root),去搜索堆里的对象,如果能搜索的到,说明这个对象就是有用的,活着的,如果搜索不到,那就说明这些对象就已经死了,这样的算法就能解决引用计数法的循环引用的问题。
- 可以作为GC Root的有
1.虚拟机栈中引用的对象
2.本地方法栈中引用的对象
3.方法区中的类静态属性引用的对象
4.方法区中常量引用的对象
3.引用的类型
- 强引用:有效的引用的,永远不会被回收;
- 软引用:只有在没办法的时候,才会去回收的引用;
- 弱引用:只要GC来回收了,就要被回收;
- 虚引用:没用的引用,不来管了;
4.方法区的回收
- 方法区的回收有两部分:废弃常量和无用的类
- 一个常量没用引用任何对象,则回收
- 无用的类的判定:
1.该类的所有实例都已经被回收,堆中已经没有这个类的任何对象;
2.加载该类的ClassLoader被回收;
3.该类的Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法; - 在大量使用反射,动态代理,CGLib等ByteCode框架,动态生成JSP,以及OSGi这类自定义ClassLoader的场景都需要虚拟机具备类卸载的功能,防止方法区溢出;