为什么我的代码导致OOM并使JVM退出,但我没有看到JVM崩溃日志(hs_err_pid)
我希望代码使JVM退出并崩溃,我看到JVM退出,但我没有看到JVM崩溃日志(hs_err_pid),命令“sudo egrep-i'java'/var/log/messages”没有任何消息,因此不是linux杀死进程。但是我可以看到消息“processfinishedwithexit code 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为什么我的代码导致OOM并使JVM退出,但我没有看到JVM崩溃日志(hs_err_pid),jvm,Jvm,我希望代码使JVM退出并崩溃,我看到JVM退出,但我没有看到JVM崩溃日志(hs_err_pid),命令“sudo egrep-i'java'/var/log/messages”没有任何消息,因此不是linux杀死进程。但是我可以看到消息“processfinishedwithexit code 1”,所以问题是什么使jvm退出 首先: java-Xmx50M-Xms50M-XX:ErrorFile=/home/wks/javacode/java_error.log-XX:+PrintGCDet
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());
}
}
}
import java.util.ArrayList;
导入java.util.List;
公共类MakeVmAbort{
静态列表ts=newarraylist();
静态列表bs=newarraylist();
公共静态void main(字符串[]args){
试一试{
while(true){
线程t=新线程(()->{
while(true){
添加(新字节[1024*1024]);
试一试{
线程。睡眠(500L);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
});
t、 start();
ts.add(t);
}
}捕获(例外e){
System.out.println(e.getStackTrace());
}
}
}
JVM退出是因为主线程抛出OOM,所以JVM在最后一个非守护进程线程完成时退出,
感谢@apangin为什么你认为JVM应该崩溃?事实上,当我发现没有崩溃日志时,我不认为JVM是崩溃的,但是什么让JVM退出,OOM?但是我想我应该把线弄好是的。当最后一个非守护进程线程完成时,JVM退出。请注意,
main
线程也会抛出OutOfMemoryError
。