【Java 18】废弃对象终止机制
对象终止机制(Finalization)是 JDK 1.0 中就存在的机制。它的设计目标是避免出现资源泄露。JVM 的垃圾回收器负责进行内存的回收。但是有些对象表示的是操作系统的资源,比如文件句柄和原生内存,需要被释放回操作系统。
在对象终止机制中,每个类可以声明一个 finalize
方法。在该方法的实现中,添加释放资源的逻辑,比如调用 close
方法。当对象不可达时,GC 会首先调用 finalize
方法,再回收该对象。虽然对象终止机制看上去很巧妙,但是在实际上存在很多问题。比如,finalize
方法被调用的时机是不确定的,甚至可能永远不会被调用。finalize
方法还可能造成对象重生的诡异问题。
因为对象终止机制的这些问题,目前已经不推荐使用 finalize
方法,而是使用替代的技术。一种做法是使用 try-with-resources
来手动释放资源。如果资源的生命周期较长,则可以使用 Java 9 增加的 Cleaner
API。
从 Java 18 开始,对象终止机制被废弃,但仍然是默认启用的。JVM 启动参数 --finalization=disabled
可以禁用对象终止机制。通过这个参数,可以测试应用是否依赖对象终止机制。由于对象终止机制在 JDK 和流行的库中被大量使用,对象终止机制在短期内不会被移除。不过应该考虑对已有的代码进行迁移。