我正在阅读“Oracle认证助理,Java SE 7程序员学习指南”一书。
在finalize方法的主题上有句子:“无法保证方法将执行,因为程序可以终止而不需要运行垃圾收集”。
我的问题是:在垃圾收集例程运行之前,程序为何以及何时终止?
答案 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通常不会运行(比如等待请求的服务器进程。