0

我一直认为OutOfMemoryError重启JVM。
但是我看到了一种行为,这种行为OutOfMemoryError没有从代码中捕获(实际上我什至不知道这是否可能)
并且JVM继续(尽管产生了核心转储)。
谁能帮我理解这种行为?

4

5 回答 5

3

OutOfMemoryError和其他任何情况一样是一个例外。它当然不会重新启动 JVM。它可能会导致它发生的线程结束,但只有当它没有被任何地方捕获时才会发生这种情况。您可能看到的不是核心转储,而只是捕获的异常的堆栈跟踪及其使用e.printStackTrace().

于 2012-08-02T09:17:45.373 回答
2

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-02T09:59:46.413 回答
1

OutOfMemoryError 或任何异常都不会重新启动 JVM。

我看到发生 OutOfMemoryError 的行为,这不是从代码中捕获的

----> OutOfMemoryError继承java.lang.Error. 错误描述了可能很少见或难以恢复的环境问题,例如计算机内存不足。您不应该处理 Error 类对象,但您应该使用Throwable. 这些应该被视为环境缺陷。

看看Exception Hierarchy

于 2012-08-02T09:25:16.260 回答
1

OutOfMemory 只是由于缺少可用内存而无法实例化对象时引发的错误。这不会停止 JVM,就像没有其他异常或错误一样。

于 2012-08-02T09:18:02.507 回答
1

没有 Throwable 会重新启动 JVM。OutOfMemoryError 就像所有其他运行时异常或错误一样:它传播调用堆栈直到它被捕获。如果不是,则线程的 UncaughtExceptionHandler 处理此异常,通常通过终止线程并打印异常的堆栈跟踪。

于 2012-08-02T09:18:30.613 回答