java对象存活判断

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值