程序何时在垃圾收集例程运行之前终止

时间:2014-12-12 13:15:33

标签: java garbage-collection

我正在阅读“Oracle认证助理,Java SE 7程序员学习指南”一书。

在finalize方法的主题上有句子:“无法保证方法将执行,因为程序可以终止而不需要运行垃圾收集”。

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

3 个答案:

答案 0 :(得分:2)

运行此程序

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

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

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

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

答案 1 :(得分:0)

程序可能会终止以下方案。

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

将发生System.exit();

内存不足。

强制关闭案例(从OS程序中删除信号)。

答案 2 :(得分:0)

关于垃圾收集的唯一保证是它会在OutOfMemoryError被抛出之前做出尽力而为的尝试。

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

实际上,如果你有一个短命的JVM实例(例如一个只运行1-2秒的简单工具)或者你的进程实际上没有分配大量内存,GC通常不会运行(比如等待请求的服务器进程。