我写了下面这个简单的程序:
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运行此程序,并期望程序收到抛出的错误。但即使在抛出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,但没有创建任何文件。我做错什么了?
发布于 2018-06-04 03:50:23
-XX:OnOutOfMemoryError只对自己抛出的OutOfMemoryErrors有效。
用户生成的OutOfMemoryErrors与其他任何常规的Throwable没有什么不同,它们也不会被JVM特殊对待。
https://stackoverflow.com/questions/50669761
复制相似问题