我一直认为OutOfMemoryError
会重新启动JVM
但我看到一个OutOfMemoryError
发生的行为,这不会从代码中捕获(实际上我甚至不知道这是否可行)
并且JVM
继续(虽然产生核心转储)
任何人都可以帮我理解这种行为吗?
答案 0 :(得分:3)
OutOfMemoryError
是一个例外,就像其他任何一样。它肯定不会重启JVM。它可能会导致它发生的线程结束,但只有当它没有被捕获时才会发生。您可能看到的不是核心转储,而只是捕获的异常的堆栈跟踪以及使用e.printStackTrace()
显式打印的堆栈跟踪。
答案 1 :(得分: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
答案 2 :(得分:1)
Out Of Memory只是在由于缺少可用内存而无法实例化对象时引发的错误。这不会阻止JVM,就像没有其他异常或错误一样。
答案 3 :(得分:1)
No Throwable永远不会重启JVM。 OutOfMemoryError就像每个其他运行时异常或错误一样:它传播调用堆栈直到它被捕获。如果不是,则线程的UncaughtExceptionHandler处理此异常,通常是通过终止线程并打印异常的堆栈跟踪。
答案 4 :(得分:1)
OutOfMemoryError或任何异常永远不会重启JVM。
我看到发生OutOfMemoryError的行为,这不会从代码
中捕获
----&GT; OutOfMemoryError继承java.lang.Error
。错误描述了可能很少或难以从诸如计算机存储器耗尽之类的环境问题。您不应该处理Error类对象,但应该使用Throwable
来处理它们。这些应该被视为
环境缺陷。