什么叫可触及性,就是GC时,是根据它来确定对象是否可被回收的。也就是说,从根节点开始是否可以访问到某个对象,也说明这个对象是否被使用。分为3种状态:
- 可触及:从根节点开始,可以到达某个对象。
- 可复活:对象引用被释放,但是可能在finalize()函数中被初始化复活。
- 不可触及:由于finalize()只会执行一次,所以,错过这一次复活机会的对象,则为不可触及状态。
看下面例子:DieAliveObject.java
【补充知识点】
- Java9中finalize方法为什么被废弃。
- 因为finalize()函数有可能发生引用外泄,在无意中复活对象。
- 由于finalize()函数是被系统调用的,调用时间是不明确的,因此不是一个好的资源释放方案,推荐在try-catch-finally语句中进行资源的释放。
- java.lang.ref.Cleaner和java.lang.ref.PhantomReference提供更灵活和有效的方式,在对象无法再访问时释放资源。