java如何判断一个对象是否存活

1. 引用计数法

引用计数器法:每个对象设置一个引用计数器,当对象被引用,计算器加1,当引用失效,计算器减一。当计数器为0时,
表示引用失效,也就是"死对象",可以被垃圾回收机制回收。
缺陷:无法解决循环依赖的问题。有两个对象A、B。当A引用B,B引用A时,那么此时A、B对象都不为0,垃圾回收机
制无法被回收。

2. 可达性算法(引用链法)

从GCRoot开始向下搜索,如果一个对象没有与任何引用链相连时,表示这个对象是垃圾对象,
可以被垃圾回收机制回收。
GC Roots的对象:
虚拟机栈中的引用对象
方法区类静态引用对象
方法区常量池引用对象
本地方法栈JNI引用的对象

注意:虽然算法可以判断一个对象是否是垃圾对象,但是并不是垃圾对象就可以被回收的。当一个对象不可达GC Root时,这个对象并不会立马被回收,而是出于一个死缓的阶段,若要被真正的回收需要经历两次标记。如果对象在可达性分析中没有与GC Root的引用链,那么此时就会被第一次标记并且进行一次筛选,筛选的条件是是否有必要执行finalize()方法。当对象没有覆盖finalize()方法或者已被虚拟机调用过,那么就认为是没必要的。
如果该对象有必要执行finalize()方法,那么这个对象将会放在一个称为F-Queue的对队列中,虚拟机会触发一个Finalize()线程去执行,此线程是低优先级的,并且虚拟机不会承诺一直等待它运行完,这是因为如果finalize()执行缓慢或者发生了死锁,那么就会造成F-Queue队列一直等待,造成了内存回收系统的崩溃。GC对处于F-Queue中的对象进行第二次被标记,这时,该对象将被移除”即将回收”集合,等待回收。

触发垃圾回收机制的条件

在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。

发布了77 篇原创文章 · 获赞 39 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_33824312/article/details/105125735