[英]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
当你看到下面
Exception in thread "main" java.lang.OutOfMemoryError
这意味着您的错误或异常由异常处理程序处理。 这不是崩溃。
查找要为其进行堆转储的进程 ID
ps -ef | grep java
通过运行上面的命令获得 PID 后,运行下面的命令来生成堆转储。
jmap -dump:format=b,file=<fileName> <java PID>
您可以将以下 JVM 参数传递给您的应用程序:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=
当您的应用程序遇到 OutOfMemoryError 时,此参数将自动触发指定“文件路径”中的堆转储。 有 7 种不同的选项可以从您的应用程序中获取堆转储:
可以在本文中找到有关每个选项的详细信息。 捕获堆转储后,您可以使用Eclipse 内存分析工具、 HeapHero等工具来分析捕获的堆转储。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.