java - 内存不足时杀死/Term java

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

    }
}

现在我使用选项 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' Mainjava "-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/

相关文章:

java - 简单来说就是 Spring 框架

java - 如何在Java中向mailto添加附件

clojure - 从 Lisp 学习 Clojure

java - JVM 能否提供快照持久化?

android - 有没有办法预测和防止 OOM 异常?

java - 数据最小原则、软件架构

java - 使用 Eclipse : JavaCC 导入项目时出错

java - jps、jstat、jstack 等命令显示 "<pid> not found"

java - 使用 Stanford CoreNLP - Java 堆空间

java - 解码位图时出现 OutOfMemory 异常