Kill/Term java 内存不足

Kill/Term java on 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){ }
        }

    }
}

现在我 运行 使用选项 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[=13=](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' Mainjava "-XX:OnOutOfMemoryError=kill -9 %p" Main 但它仍然有效...

我也尝试检查它并执行 sudo java -XX:OnOutOfMemoryError="echo 233 > /root/oom" Main,预期 /root/oom 将包含 223,但没有创建文件。我做错了什么?

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

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