我想在 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();
}
}
我按如下方式运行它
[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)
我得到了我想要的 OutOfMemoryError,但工作目录中没有堆转储(如我预期的 hs_err_pidXXXX.log
)。我错过了什么?如何获取堆转储?
更新:
我试过 -XX:ErrorFile=.
还是没用。如果以上方法不是获取堆转储(崩溃 JVM)的方法,我如何让我的 JVM 崩溃以获取这些日志?
最佳答案
您将抛出的异常或错误混淆为 JVM 崩溃。
JVM 崩溃是由于 JVM 内部错误引起的,您不能通过编写普通的 Java 程序来触发它(或者不应该,除非您发现错误)
你正在做的是触发一个错误,这意味着程序将继续运行,直到所有非守护线程退出。
检查堆的最简单工具是 JDK 附带的 VisualVM。如果你想在 OutOfMemoryError 上触发堆转储,你可以使用 -XX:+HeapDumpOnOutOfMemoryError
关于java - 如何进行heap dump?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18527054/