【问题标题】:How to take heap dump?如何进行堆转储?
【发布时间】:2013-09-02 20:06:23
【问题描述】:

我想在 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=. 还是没用。如果上述方法不是获取堆转储(Crash JVM)的方法,我该如何让我的 JVM 崩溃以获取这些日志?

【问题讨论】:

  • hs_err_pidXXXX.log 仅在 JVM 崩溃时创建,而不是应用程序。
  • 您可以使用 eclipse 记录堆转储查看此处了解详细信息stackoverflow.com/questions/837351/…
  • 那我该如何让我的 JVM 崩溃呢?我需要生成那个文件。

标签: java jvm heap-dump jvm-crash


【解决方案1】:

您混淆了作为 JVM 崩溃抛出的异常或错误。

由于 JVM 中的内部错误而发生 JVM 崩溃,您无法通过编写普通的 Java 程序来触发此错误(或者除非发现错误,否则不应触发)

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

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

【讨论】:

  • 其实有一个bug,我正在尝试重现它!
  • @AniketThakur JVM 或您的代码中的错误?我建议您包含错误的详细信息,因为这是您的真正问题。
  • -XX:+HeapDumpOnOutOfMemoryError 是我想要的。谢谢!
【解决方案2】:

使用Jmap

jmap [options] pid

pid是应用程序的进程id

【讨论】:

    【解决方案3】:

    当你看到下面

    Exception in thread "main" java.lang.OutOfMemoryError
    

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

    【讨论】:

      【解决方案4】:

      Eclipse 有一个很棒的Heap Analyzer

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

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

      【讨论】:

        【解决方案5】:

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

        ps -ef | grep java
        

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

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

        【讨论】:

          【解决方案6】:

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

          -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=

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

          1. jmap
          2. -XX:+HeapDumpOnOutOfMemoryError
          3. jcmd
          4. JVisualVM
          5. JMX
          6. 程序化方法
          7. 管理控制台

          可以在in this article 找到有关每个选项的详细信息。捕获堆转储后,您可以使用Eclipse Memory Analysis toolHeapHero 等工具来分析捕获的堆转储。

          【讨论】:

            猜你喜欢
            • 2017-10-31
            • 1970-01-01
            • 2020-12-04
            • 1970-01-01
            • 2015-09-04
            • 2015-08-12
            • 2011-01-26
            • 2010-10-07
            • 1970-01-01
            相关资源
            最近更新 更多