【问题标题】:When does the program terminate before the garbage collection routine run程序何时在垃圾收集例程运行之前终止
【发布时间】:2015-02-11 05:08:57
【问题描述】:

我正在阅读《Oracle Certified Associate, Java SE 7 Programmer Study Guide》一书。

关于 finalize 方法的主题有一句话:“不能保证方法会执行,因为程序可能会在不需要垃圾收集运行的情况下终止”。

我的问题是:程序为什么在垃圾收集例程运行之前终止以及何时终止?

【问题讨论】:

  • 因为它会在任何感觉或内存不足时运行。
  • 这超出了规范的范围,只取决于JVM的实现
  • 如果你的程序正在退出,内存无论如何都会被释放,所以垃圾回收会浪费时间和精力。
  • 如果不需要,GC 为什么要运行?

标签: java garbage-collection


【解决方案1】:

运行这个程序

public static void main(String[] args) throws Exception {
    new Object() {
        @Override
        protected void finalize() throws Throwable {
            System.out.println("GC");
        }
    };
}

程序将终止,但 GC 将不起作用。如果可以,那么它会调用 finalize() 并且我们会在控制台上看到输出。 GC 在 JVM 堆低时运行,要使其运行,请添加此代码

    for(int i = 0; i < 1000; i++) {
        byte[] a = new byte[100000000];
    }

它创建了一个快速填满堆的大数组,这使得JVM运行GC,实际上GC可能会运行几次,但JVM只能调用一次finalize

【讨论】:

    【解决方案2】:

    程序可能会终止以下情况。

    无论恶魔线程如何,所有线程都会停止。

    会发生System.exit();

    内存不足。

    强行关闭情况(从操作系统到程序的终止信号)。

    【讨论】:

      【解决方案3】:

      关于垃圾回收的唯一保证是它会在抛出 OutOfMemoryError 之前尽最大努力尝试。

      理论上你可以有一个 JVM,其中“尽力而为”意味着“什么也不做”,因为它没有垃圾收集器。

      实际上,如果您有一个短暂的 JVM 实例(例如,一个仅运行 1-2 秒的简单工具)或者您的进程实际上没有分配太多内存(例如等待请求的服务器进程)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-03
        • 2012-01-19
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-16
        相关资源
        最近更新 更多