You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

当无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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:46:55