如何进行堆转储?

Ani*_*kur 3 java jvm jvm-crash heap-dump

我想在JVM崩溃时收集堆转储

所以我写了一个简单的代码

public class Test {
private String name;

public Test(String name) {
    this.name = name;
}

public void execute() {

    Map<String,String> randomData = new HashMap<String,String>();
    for(int i=0;i<1000000000;i++) {
       randomData.put("Key:" + i,"Value:" + i);
    }
}

public void addData() {
}

public static void main(String args[]) {
    String myName = "Aniket";
    Test tStart = new Test(myName);
    tStart.execute();
}
}
Run Code Online (Sandbox Code Playgroud)

我按如下方式运行它

[aniket@localhost Desktop]$ java -cp . -Xms2m -Xmx2m Test
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at Test.execute(Test.java:15)
    at Test.main(Test.java:25)
Run Code Online (Sandbox Code Playgroud)

我得到了OutOfMemoryError我想要但工作目录中没有堆转储(就像hs_err_pidXXXX.log我期望的那样).我错过了什么?我如何获得堆转储?

更新:

我试过-XX:ErrorFile=.还没用.如果上面不是获取堆转储(Crash JVM)的方法,我怎么能让我的JVM崩溃才能获得这些日志?

Pet*_*rey 6

您混淆了因JVM崩溃而引发的异常或错误.

由于JVM中的内部错误导致JVM崩溃,您无法通过编写正常的Java程序来触发此问题(除非您发现错误,否则不应该触发)

你正在做的是触发一个错误,这意味着程序继续运行,直到所有非守护程序线程退出.

检查堆的最简单工具是JDK附带的VisualVM.如果要在OutOfMemoryError上触发堆转储,则可以使用-XX:+HeapDumpOnOutOfMemoryError

  • @AniketThakur JVM或您的代码中的错误?我建议你包括bug的细节,因为这是你真正的问题. (2认同)