Java 中 finalize 方法怎么在对象回收前进行最后一次拯救

小伟同学_8162

小伟同学_8162

2026-10-01

750人浏览

原创

javascript-pro
javascript-pro

专注现代 ECMAScript、异步编程、性能优化和全栈的 JavaScript 专家,适用于现代开发

下载
finalize方法不能可靠用于对象“最后一次拯救”,它不保证执行、不保证及时性、自java 9起被弃用、java 18默认禁用,且对象复活不可靠、状态易损坏、无二次清理机会。

java 中 finalize 方法怎么在对象回收前进行最后一次拯救

Java 中的 finalize 方法**不能可靠地用于“最后一次拯救”对象**,它既不保证执行,也不保证及时执行,更不推荐用于资源清理或对象复活。自 Java 9 起已被标记为 @Deprecated,Java 18 开始默认禁用(可通过 JVM 参数开启,但不建议)。

finalize 的设计本意与现实限制

该方法原本设想在垃圾回收器准备回收对象前,由 JVM 自动调用一次,供开发者执行清理逻辑(如关闭文件、释放 native 资源)。但实际中存在严重问题:

  • 不保证调用:JVM 可能在退出前不触发 GC,finalize 永远不会执行;
  • 不保证顺序和时机:可能延迟数秒甚至更久,无法预测何时被调用;
  • 只调用一次:即使在 finalize 中让对象重新可达(即“复活”),JVM 也不会再次调用它;
  • 性能开销大:启用 finalize 的对象会被放入专门队列,延长 GC 周期,拖慢整个堆回收。

所谓“拯救”——对象复活的危险操作

技术上,你可以在 finalize 方法中将 this 赋值给某个静态引用或全局容器,使对象重新可达,从而避免被回收。例如:

(仅作演示,切勿在生产代码中使用)

public class Rescuable {
    private static Rescuable saved;

    @Override
    protected void finalize() throws Throwable {
        System.out.println("finalize called");
        saved = this; // 让对象重新被引用 → “复活”
        super.finalize();
    }
}

但这种做法极不可靠:

  • 复活后对象状态可能已损坏(如 native 资源已被释放、字段被重置);
  • 无法控制复活时机,可能引发竞态或 NPE;
  • JVM 不会再次调用 finalize,若该对象后续再次不可达,将直接回收,无第二次机会。

现代替代方案:安全、可控、可预测

真正需要“最后清理”或“资源保障”,应使用以下标准方式:

  • 显式关闭 + try-with-resources:对实现 AutoCloseable 的资源(如 FileInputStream、Connection),用 try 自动调用 close();
  • Cleaner(推荐):Java 9+ 提供的轻量级、非阻塞、可注册清理动作的机制,基于虚引用(PhantomReference),不干扰 GC,且可取消;
  • Runtime.addShutdownHook():适用于 JVM 关闭前的全局清理(如保存缓存、关闭线程池),但不适用于单个对象生命周期管理;
  • 显式生命周期管理:让调用方负责调用 dispose()、shutdown() 等方法,配合文档和静态检查工具(如 @MustBeClosed)提升可靠性。

总结:别依赖 finalize,也别尝试“拯救”

finalize 是历史遗留机制,语义模糊、行为不确定、性能差、易出错。对象“复活”不是设计特性,而是副作用,且违背 JVM 内存模型的确定性假设。所有需要资源清理或状态保障的场景,都应转向 Cleaner、try-with-resources 或显式管理。把 finalize 当成一个早已失效的开关,彻底忽略它,是写出健壮 Java 代码的第一步。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

9417

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

6582

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

5872

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1024

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

868

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1236

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2469

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19811

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1115

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习