内存不足时杀死/Term java

Som*_*ame 2 java jvm out-of-memory

我写了下面的简单程序:

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){ }
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

现在我使用选项运行它java -XX:OnOutOfMemoryError="kill -9 %p" Main并期望程序收到SIGKILL抛出的错误。Doing some job...但即使在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...
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...
Run Code Online (Sandbox Code Playgroud)

这有什么问题吗?

我上线了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,但没有创建文件。我做错了什么?

apa*_*gin 5

-XX:OnOutOfMemoryError仅适用于 JVM 本身抛出的 OutOfMemoryErrors。

用户生成的 OutOfMemoryErrors 与任何其他常规 Throwable 没有什么不同,并且 JVM 不会对它们进行特殊处理。