我编写了以下简单的程序:
public class Main{
public static void main(String[] args) throws Exception{
new Thread(() -> {
try{
Thread.sleep(10000);
} catch(Exception ignored){ }
throw new OutOfMemoryError("BOOM!");
}).start();
while(true){
System.out.println("Doing some job...");
try{
Thread.sleep(1000);
} catch(Exception ignored){ }
}
}
}
现在我使用选项 java -XX:OnOutOfMemoryError="kill -9 %p"Main
运行此程序,并期望程序收到抛出的错误 SIGKILL
。但即使在抛出 OutOfMemoryError
后,它最终也会打印 Doing some job...
:
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Exception in thread "Thread-0" java.lang.OutOfMemoryError: BOOM!
at Main.lambda$main$0(Main.java:11)
at java.lang.Thread.run(Thread.java:748)
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
这有什么问题吗?
我使用的是java 1.8.0_66
我尝试执行 java -XX:OnOutOfMemoryError='kill -9 %p' Main
和 java "-XX:OnOutOfMemoryError=kill -9 %p"Main
但它仍然继续工作...
我还尝试检查它并执行 sudo java -XX:OnOutOfMemoryError="echo 233 >/root/oom"Main
并预期 /root/oom
将包含223
,但未创建任何文件。我做错了什么?
最佳答案
-XX:OnOutOfMemoryError
仅适用于 JVM 本身抛出的 OutOfMemoryError。
用户生成的 OutOfMemoryErrors 与任何其他常规 Throwable 没有什么不同,并且 JVM 不会对它们进行特殊处理。
关于java - 内存不足时杀死/Term java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50669761/