我一直认为OutOfMemoryError会重新启动虚拟机。
但是我看到了一种行为,其中发生了OutOfMemoryError,这不是从代码中捕获的(实际上,我甚至不知道这是否可能)
然后继续执行JVM (不过会产生一个核心转储)。
有人能帮我理解这个行为吗?
发布于 2012-08-02 17:59:46
OutOfMemoryError向一个线程报告其内存分配失败。
int count = 0;
long start = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
try {
long[] longs = new long[Integer.MAX_VALUE];
} catch (OutOfMemoryError e) {
count++;
}
}
long time = System.currentTimeMillis() - start;
System.out.printf("Got %,d OutOfMemoryErrors in %.1f seconds%n", count, time/1e3);打印
Got 10,000,000 OutOfMemoryErrors in 3.9 seconds发布于 2012-08-02 17:17:45
OutOfMemoryError是一个例外,就像其他任何例外一样。它当然不会重启JVM。它可能会导致它所在的线程结束,但只有在它没有被捕获的情况下才会发生。您看到的可能不是核心转储,而仅仅是捕获的异常的堆栈跟踪,并使用e.printStackTrace()显式地打印它的堆栈跟踪。
发布于 2012-08-02 17:18:03
OutOfMemory只是一个错误,当一个对象由于缺乏可用内存而无法实例化时,就会抛出这个错误。这不会停止JVM,就像没有其他异常或错误一样。
https://stackoverflow.com/questions/11774399
复制相似问题