繁体   English   中英

如何进行堆转储?

[英]How to take 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();
}
}

我按如下方式运行它

[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

使用Jmap

jmap [options] pid

pid 是应用程序的进程 ID

当你看到下面

Exception in thread "main" java.lang.OutOfMemoryError

这意味着您的错误或异常由异常处理程序处理。 这不是崩溃。

Eclipse 有一个很棒的堆分析器

此外,您可以使用jps获取 PID,然后使用jmap获取堆本身。

如果您想让 JVM 崩溃,您最好的猜测是本机代码。

查找要为其进行堆转储的进程 ID

ps -ef | grep java

通过运行上面的命令获得 PID 后,运行下面的命令来生成堆转储。

jmap -dump:format=b,file=<fileName> <java PID>

您可以将以下 JVM 参数传递给您的应用程序:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=

当您的应用程序遇到 OutOfMemoryError 时,此参数将自动触发指定“文件路径”中的堆转储。 有 7 种不同的选项可以从您的应用程序中获取堆转储:

  1. 地图
  2. -XX:+HeapDumpOnOutOfMemoryError
  3. jcmd
  4. 虚拟机
  5. JMX
  6. 程序化方法
  7. 管理控制台

可以在本文中找到有关每个选项的详细信息。 捕获堆转储后,您可以使用Eclipse 内存分析工具HeapHero工具来分析捕获的堆转储。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM