【发布时间】: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