如何获取堆转储?

4
我希望在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 以获取这些日志?


2
hs_err_pidXXXX.log 只有在 JVM 崩溃时才会创建,而不是应用程序。 - Levente Kurusa
您可以使用Eclipse记录堆转储,详情请参见此处:https://dev59.com/OkfRa4cB1Zd3GeqP9oAa - Dileep
那么我该如何使我的JVM崩溃?我需要生成那个文件。 - Aniket Thakur
6个回答

7
你把异常或错误被抛出与JVM崩溃混淆了。
JVM崩溃是由于JVM内部错误引起的,你不能通过编写普通的Java程序来触发它(除非你发现了一个bug)。
你所做的是触发错误,这意味着程序将继续运行,直到所有非守护线程退出。
检查堆最简单的工具是随JDK一起提供的VisualVM。如果你想在OutOfMemoryError上触发堆转储,可以使用-XX:+HeapDumpOnOutOfMemoryError

实际上有一个bug,我正在尝试复现它! - Aniket Thakur
2
@AniketThakur 是JVM还是你的代码出了问题?我建议你包含bug的详细信息,因为这才是你真正的问题。 - Peter Lawrey
-XX:+HeapDumpOnOutOfMemoryError 是我想要的。谢谢! - Aniket Thakur

1
使用 Jmap
jmap [options] pid

pid是应用程序的进程ID


1
当你看到下面的内容:
Exception in thread "main" java.lang.OutOfMemoryError

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

0

找到你想要获取堆转储的进程 ID

ps -ef | grep java

运行上述命令获取PID后,运行下面的命令生成堆转储。

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

0

Eclipse有一个很棒的堆分析器

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

如果您想崩溃JVM,最好的猜测是使用本地代码。


0
您可以将以下JVM参数传递给您的应用程序:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=
当您的应用程序遇到OutOfMemoryError时,此参数将自动在指定的“文件路径”中触发堆转储。有7种不同的选项可从应用程序中获取堆转储:
  1. jmap
  2. -XX:+HeapDumpOnOutOfMemoryError
  3. jcmd
  4. JVisualVM
  5. JMX
  6. 编程方法
  7. 管理控制台
每个选项的详细信息可以在本文中找到。一旦捕获了堆转储,您可以使用Eclipse Memory Analysis toolHeapHero等工具来分析捕获的堆转储。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接