当无Java程序运行时垃圾回收器是否运行?兼问finalize方法执行时机
关于Java垃圾回收器和finalize方法的两个问题解答
一、没有Java程序运行时,垃圾回收器会运行吗?
简单来说:不会。
垃圾回收器(GC)是Java虚拟机(JVM)的核心组件之一,它的运行完全依附于JVM进程。当没有Java程序在运行时,意味着对应的JVM进程已经终止了——没有了运行的载体,GC自然也就停止工作了。只有当JVM进程存活,并且堆内存需要清理时,GC才会被触发执行。
二、程序执行结束时,对象的finalize方法一定会被调用吗?
答案是:JVM不保证这一点。
你提到的finalize方法文档描述是准确的:当GC判定某个对象不再有任何引用时,会调用该对象的finalize方法。但这里有几个关键细节容易被忽略:
- finalize方法的执行时机完全由GC的调度决定,JVM没有承诺会在某个特定时间点执行它;
- 当Java程序执行结束时,JVM会直接终止进程,此时操作系统会回收该进程占用的所有系统资源(包括内存、文件句柄等)。为了提高退出效率,JVM通常不会花费时间去触发GC、执行所有未被引用对象的finalize方法——毕竟这些工作对进程终止后的资源回收没有意义。
举个例子,看你给出的代码片段:
public final class MainClass{ public static void main(String[] args) { A s = new A(5); s = new A(6); // 原来的A(5)对象成为无引用垃圾 System.out.println(s); // ... 后续代码 } }
这里的A(5)对象虽然已经没有引用,但JVM可能在程序结束前根本不会触发GC,或者即使触发了,也可能因为程序即将退出而跳过它的finalize方法执行。
额外提醒
finalize方法本身存在很多问题(比如执行时机不可控、可能导致对象复活、性能开销大等),从Java 9开始它已经被标记为废弃了。如果需要做资源清理,更推荐使用try-with-resources语句(针对实现AutoCloseable接口的资源),或者显式的清理方法,这些方式更可靠、可控。
内容的提问来源于stack exchange,提问作者Naveen Dennis
相关产品推荐
相关产品推荐

