【问题标题】:why my code cause OOM and make JVM exit but i hava not see the JVM crash log (hs_err_pid)为什么我的代码导致 OOM 并使 JVM 退出但我没有看到 JVM 崩溃日志 (hs_err_pid)
【发布时间】:2019-11-07 23:36:09
【问题描述】:

我希望代码使 JVM 退出并崩溃,我看到 JVM 退出,但我没有看到 JVM 崩溃日志 (hs_err_pid),以及命令“sudo egrep -i 'java' /var/log/messages “没有任何消息,所以它不是 linux 杀死进程。但我可以看到消息“进程以退出代码 1 完成”所以问题是什么让 jvm 退出

开始: java -Xmx50M -Xms50M -XX:ErrorFile=/home/wks/javacode/java_error.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:/home/wks/javacode/gc.log

import java.util.ArrayList;
import java.util.List;



public class MakeVmAbort {

    static List<Thread> ts = new ArrayList<>();

    static List<byte[]> bs = new ArrayList<>();

    public static void main(String[] args) {

        try {
            while (true) {
                Thread t = new Thread(() -> {
                    while (true) {
                        bs.add(new byte[1024 * 1024]);
                        try {
                            Thread.sleep(500L);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                });
                t.start();
                ts.add(t);
            }

        } catch (Exception e) {
            System.out.println(e.getStackTrace());
        }
    }

}

【问题讨论】:

  • 你认为JVM为什么会崩溃?
  • 其实,当我发现没有崩溃日志时,我不认为JVM崩溃了,但是是什么让JVM退出,OOM?但我认为OOM只是完成线程
  • 是的。当最后一个非守护线程完成时,JVM 退出。请注意,main 线程也会抛出 OutOfMemoryError

标签: jvm


【解决方案1】:

JVM退出因为main Thread Throw OOM,所以JVM在最后一个非守护线程结束时退出, 感谢@apangin

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多