java对象存活判断

java对象存活判断


1.判断对象是否存活的算法

    1.1引用计数算法

            为每一个对象设置一个对象引用计算器,每当有地方引用到该对象的时候,该对象的引用计算器就自动的加一,如果每当引用失效的时候,该对象的引用计算器就会相应的减一。任何时刻当该对象的引用计数器为0的时候就说明了该对象不再被引用。

     1.1.1引用计算算法的缺点

             当objA和objB相互引用的时候,他们的引用计数器都是1,他们相互引用着对方,但是实际上这两个对象已经不能被访问,于是引用计数器无法通知系统区回收他们。

  1. objA.instance = objB;  
  2. 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方法中与任何一个对象进行关联的话便可以不会被回收。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页