如何进行堆转储?

时间:2013-08-30 07:14:35

标签: 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崩溃以获取这些日志?

6 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:1)

使用Jmap

jmap [options] pid

pid是应用程序的进程ID

答案 2 :(得分:1)

当你看到下面的

Exception in thread "main" java.lang.OutOfMemoryError

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

答案 3 :(得分:0)

Eclipse有一个很棒的Heap Analyzer

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

如果您希望崩溃JVM,最好的猜测就是本机代码。

答案 4 :(得分:0)

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

Save.post

通过运行以下命令运行以下命令来获取PID以生成堆转储。

ps -ef | grep java

答案 5 :(得分:0)

您可以将下面的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之类的工具来分析捕获的堆转储。