现代 Java 中 Object.finalize() 的作用和重要性如何体现?
- 内容介绍
- 文章标签
- 相关推荐
本文共计893个文字,预计阅读时间需要4分钟。
`Object.finalize()` 在现代 Java 开发中已基本退出舞台——它不再是不推荐使用,而是不应当使用。自 Java 9 开始,该方法被正式标记为 `@Deprecated`,到 Java 18 时,明确标注 `forRemoval=true`,表明 JVM 团队已决定不再支持其设计价值。
它的存在不再代表一种清理选项,而是一个需要主动规避的历史遗留问题。
不可靠的执行时机是根本缺陷
finalize() 的调用完全依赖 GC 行为,而 GC 由内存压力、算法策略、JVM 参数等共同决定。这意味着:
- 对象变成垃圾后,可能数分钟甚至整个程序生命周期内都不会触发 finalize()
- 程序结束前,GC 可能一次都不运行,导致资源始终未释放
- 即使触发,也无法保证顺序或线程上下文,不适合协调多个资源的关闭
它会拖慢垃圾回收并引入风险
每个重写了 finalize() 的对象,在被识别为可回收时,不会立即入回收队列,而是先入“finalization queue”,由专用的 Finalizer 线程串行处理。
本文共计893个文字,预计阅读时间需要4分钟。
`Object.finalize()` 在现代 Java 开发中已基本退出舞台——它不再是不推荐使用,而是不应当使用。自 Java 9 开始,该方法被正式标记为 `@Deprecated`,到 Java 18 时,明确标注 `forRemoval=true`,表明 JVM 团队已决定不再支持其设计价值。
它的存在不再代表一种清理选项,而是一个需要主动规避的历史遗留问题。
不可靠的执行时机是根本缺陷
finalize() 的调用完全依赖 GC 行为,而 GC 由内存压力、算法策略、JVM 参数等共同决定。这意味着:
- 对象变成垃圾后,可能数分钟甚至整个程序生命周期内都不会触发 finalize()
- 程序结束前,GC 可能一次都不运行,导致资源始终未释放
- 即使触发,也无法保证顺序或线程上下文,不适合协调多个资源的关闭
它会拖慢垃圾回收并引入风险
每个重写了 finalize() 的对象,在被识别为可回收时,不会立即入回收队列,而是先入“finalization queue”,由专用的 Finalizer 线程串行处理。

