java 不推荐也不应依赖 finalize 方法进行资源清理,因其自 java 9 起被标记为 @deprecated(forremoval = true),jvm 不保证执行时机与次数,无法替代显式资源管理,应改用 autocloseable + try-with-resources、cleaner 或显式清理方法。

Java 中不推荐、也不应依赖 finalize 方法进行资源清理。
finalize 已被标记为废弃(Deprecated)
自 Java 9 起,Object.finalize() 方法被明确标记为 @Deprecated(forRemoval = true),表示它不仅不推荐使用,未来版本还可能被彻底移除。JVM 不保证该方法一定会执行,也不保证执行时机——可能永远不调用,也可能在程序退出前才触发,甚至在某些 GC 策略下完全跳过。
它无法替代显式资源管理
finalize 的设计初衷是作为“安全网”,用于处理未被显式释放的资源(如本地句柄),但实际中它不可靠、不可控、性能差,且容易掩盖资源泄漏问题。例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 文件流未调用
close(),指望finalize关闭?→ 文件句柄可能长时间占用,导致Too many open files错误。 - 数据库连接未关闭?→ 连接池耗尽,应用卡死。
- 即使重写了
finalize,也无法确保它在对象变成垃圾后立刻运行,更无法控制执行线程或时序。
请改用现代、可靠的替代方案
✅ 推荐做法:
-
实现
AutoCloseable接口 + try-with-resources:适用于文件、网络、数据库等需主动释放的资源。 -
使用
Cleaner(Java 9+):基于虚引用(PhantomReference)的轻量级、可预测的清理机制,不阻塞 GC,且可注册多个清理动作。 -
显式调用清理方法(如
shutdown(),close(),dispose()):由业务逻辑控制生命周期,最清晰、最可控。
如果真要了解 finalize 的写法(仅作兼容或学习用途)
语法上,需在子类中重写并调用 super.finalize()(尽管 Java 11+ 后 Object 的默认实现为空):
@Override
protected void finalize() throws Throwable {
try {
// 清理非内存资源(如 native 内存、文件句柄等)
releaseNativeResource();
} finally {
super.finalize(); // 链式调用父类(虽无实际作用,但属历史约定)
}
}
⚠️ 注意:该方法不会自动被调用;需等待 GC 触发且对象被判定为不可达;且 JVM 可能只调用一次(即使对象在 finalize 中“复活”,也不会再次调用)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










