java对象存活判断

来源:互联网 发布:手机游戏交易平台源码 编辑:程序博客网 时间:2024/04/29 09:32

java对象存活判断


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

    1.1引用计数算法

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

     1.1.1引用计算算法的缺点

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

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

2. 回收方法区

           java虚拟机规范中确实规定了虚拟机中在方法区是不会实现垃圾回收的,而且在方法区中实现垃圾回收性价比比较低,在堆中,特别是新生代,一般垃圾回收可以回收70-80%的空间,但是永生代中的效率远低于这个。

    2.1 永生代的垃圾回收包括两部分的内容    

         1 废弃常量
         2 无用的类    

    2.2无用的类的定义:    

           必须满足3个条件:

             1.该类的所有实例都已经被回收,也就是Java堆中不存在这个类的实例。

             2.加载该类的ClassLoader也已经被回收。

             3.该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问这个类。

            

0 0