java对象存活判断
1.判断对象是否存活的算法
1.1引用计数算法
为每一个对象设置一个对象引用计算器,每当有地方引用到该对象的时候,该对象的引用计算器就自动的加一,如果每当引用失效的时候,该对象的引用计算器就会相应的减一。任何时刻当该对象的引用计数器为0的时候就说明了该对象不再被引用。
1.1.1引用计算算法的缺点
当objA和objB相互引用的时候,他们的引用计数器都是1,他们相互引用着对方,但是实际上这两个对象已经不能被访问,于是引用计数器无法通知系统区回收他们。
- objA.instance = objB;
- objB.instance = objA;
objA.instance = objB;
objB.instance = objA;
1.2可达性分析算法
这个算法的基本思想是通过一个根节点RootGC作为一个起始点,从这个节点往下搜索,搜索所走过的路径就是引用链(Reference Chain),当一个对象到RootGC都没有引用链的时候(图论说法就是当一个GCRoot节点到该对象不可达),则证明此对象是不可用的。
1.2.1 java中可以用作GC Root的对象
1.虚拟机栈中引用的对象
2.方法区中静态属性引用的对象
3.方法区中常量引用的对象
4.本地方法栈JNI(即一般说的Native方法)引用的对象
1.2.2 gc自我拯救
当通过系统分析发现,RootGC节点到该对象不可达的时候,是否对象就会被回收的呢,答案不是一定的,这时候他暂时时处于缓刑阶段,至少要经过两次的标记的过程,才真正宣告一个对象的死亡,第一次是当系统检测到该对象到RootGC节点不可达的时候,进行第一次的标记,然后系统就会检查该对象有没有覆盖finalize方法,如果有的话便会执行finalize方法,如果该对象在finalize方法中与任何一个对象进行关联的话便可以不会被回收。