面试题22:什么是可触及性?finalize()的作用是什么?

2023-05-09 21:37:20 浏览数 (2)

什么叫可触及性,就是GC时,是根据它来确定对象是否可被回收的。也就是说,从根节点开始是否可以访问到某个对象,也说明这个对象是否被使用。分为3种状态:

  • 可触及:从根节点开始,可以到达某个对象。
  • 可复活:对象引用被释放,但是可能在finalize()函数中被初始化复活。
  • 不可触及:由于finalize()只会执行一次,所以,错过这一次复活机会的对象,则为不可触及状态。

看下面例子:DieAliveObject.java

【补充知识点】

  • Java9中finalize方法为什么被废弃。
  • 因为finalize()函数有可能发生引用外泄,在无意中复活对象
  • 由于finalize()函数是被系统调用的,调用时间是不明确的,因此不是一个好的资源释放方案,推荐在try-catch-finally语句中进行资源的释放。
  • java.lang.ref.Cleaner和java.lang.ref.PhantomReference提供更灵活和有效的方式,在对象无法再访问时释放资源。

0 人点赞