您的位置:首页 > 其它

JVM如何判断一个对象是不是要被回收

2019-01-19 18:51 211 查看

1,引用计数法

       每个对象创建的时候会分配一个引用计数器,当这个对象被引用的时候计数器的值就会+1。任何时候,当引用计数器值为0的时候就说明这个对象不被使用了,需要被GC回收掉。

 优点:算法简单。

 缺点:不能解决循环引用的问题,有垃圾对象不能被正确识别。

2,根搜索法

       一,以特定的对象作为基础原始对象(也被称为根),通过递归的方式不断向下搜索,从跟对象到达某个对象的路径被称为引用链。如果一个对象和跟对象之间存在引用链,那么这个对象则是存活状态,不能被回收。反之,如果一个对象与根对象之间不存在引用链,那么这个对象是不可达的,那这个对象就是可回收的垃圾对象。此种算法是GC目前使用的搜索算法。

 优点:可找到所有垃圾对象,并解决了循环引用的情况。

 缺点:需要遍历所有对象,而且递归算法难免会导致效率不高。

     二,那么都有那些对象可以被称为特定对象呢?

 I,JAVA虚拟机栈中的引用对象。

II,方法区中的类静态属性引用的对象。

III,方法区中的常量引用的对象。

IV,本地方法栈中JNI引用的对象。

     三,根算法中不可达对象在回收之前,要进行二次标记,第一次标记的时候会进行筛选,筛选是否有必要执行finalize()方法。有以下两种情况不需要执行finalize方法:

  I,当前对象类中没有覆盖finalize方法。

 II,finalize在前一次GC时已经调用过一次finalize方法了。

如果这个对象有必要执行,则会放在一个队列中,以一个低优先级的线程执行finalize方法进行二次标记,如果在finalize中,对象与根能够建立引用链,那么该对象不会被回收。

   

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: