我正在阅读"Oracle认证助理,Java 7程序员学习指南“一书。
在finalize方法的主题上,有一句话:“无法保证该方法将执行,因为程序可能会终止,而不需要运行垃圾收集”。
我的问题是:在垃圾收集例程运行之前,程序为什么以及何时终止?
发布于 2014-12-12 13:20:18
运行这个程序
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只能调用一次。
发布于 2014-12-12 13:19:05
程序可能会终止以下情况。
无论恶魔线程如何,所有线程都会停止。
将发生System.exit();
内存不足。
强行关机(从操作系统到程序的杀死信号)。
发布于 2014-12-12 13:20:36
在垃圾收集方面,您得到的唯一保证是在抛出OutOfMemoryError之前,它已经尽了最大的努力。
理论上,您可以有一个JVM,其中“最大的努力”意味着“什么都不做”,因为它没有垃圾收集器。
在实践中,如果您有一个短暂的JVM实例(例如,一个只运行1-2秒的简单工具),或者如果您的进程实际上没有分配多少内存(例如,等待请求的服务器进程),则GC通常不会运行。
https://stackoverflow.com/questions/27444496
复制相似问题