java - 如何进行heap dump?

标签 java jvm heap-dump jvm-crash

我想在 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/

相关文章:

java - Stream 在顺序模式下工作,但在并行模式下有问题

java - 无法在 Android Studio 3.1 中的当前主题中找到样式 'coordinatorLayoutStyle'

java - java编译究竟是如何发生的?

android - 为什么应用程序及其资源在退出后仍保留在内存中?

java - 如何永久增加java堆内存?

java - 如何将 Double.POSITIVE_INFINITY 转换为 BigDecimal?

java - 如何在字符串中添加整数,java并限制用户输入

java - 如何从编译时未知的索引处的局部变量加载引用?

java - Java GC 日志行之间有什么区别? ("Total time for which..."与 "[GC")

java - 进程关闭后可以打开自定义 hsperfdata_root/PID 吗?