finalize()自Java 9起被弃用、Java 18彻底移除,因其调用时机不确定、性能开销大、线程不安全、异常被吞且无法保证执行;应改用AutoCloseable+try-with-resources、Cleaner或显式释放。
Java 中 finalize() 方法已被标记为 @Deprecated,自 Java 9 起不推荐使用,Java 18 开始彻底移除(J
EP 421),因此不建议重写 finalize,也不应依赖它来释放资源。
该方法由垃圾回收器在对象真正回收前调用,但存在严重问题:
资源清理应主动、及时、可预测。推荐以下方式:
close() 或 shutdown(),并提供默认空实现防止误用示例(Cleaner):
public class Resource {
private static final Cleaner cleaner = Cleaner.create();
private final Cleanable cleanable;
private final ByteBuffer buffer;
public Resource() {
this.buffer = ByteBuffer.allocateDirect(1024);
this.cleanable = cleaner.register(this, new ResourceCleaner(buffer));
}
// 清理动作封装为 Runnable
private static class ResourceCleaner implements Runnable {
private final ByteBuffer buffer;
ResourceCleaner(ByteBuffer buffer) { this.buffer = buffer; }
public void run() { CleanerTest.freeDirectBuffer(buffer); }
}
// 显式清理(可选,用于提前释放)
public void close() { cleanable.clean(); }
}
请尽快迁移。若暂时无法删除,注意:
super.finalize()(否则父类清理逻辑丢失)基本上就这些。finalize 是个历史包袱,现代 Java 开发中应当完全绕过它。