繁体   English   中英

Java中的OutOfMemoryError行为

[英]OutOfMemoryError behavior in Java

我一直以为OutOfMemoryError重新启动JVM。
但是我看到了发生OutOfMemoryError的行为,这没有从代码中捕获(实际上我什至不知道这是否可能)
然后JVM继续运行(尽管会生成核心转储)。
谁能帮助我了解这种行为?

和其他一样, OutOfMemoryError是一个异常。 它当然不会重新启动JVM。 它可能会导致发生它的线程终止,但是只有当它没有在任何地方被捕获时,才会发生。 您可能看到的不是核心转储,而仅仅是捕获的异常的堆栈跟踪以及使用e.printStackTrace()显式打印的堆栈跟踪。

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

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

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

OutOfMemoryError或任何异常都永远不要重新启动JVM。

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

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

看一看异常层次结构

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM