我想在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崩溃以获取这些日志?
答案 0 :(得分:6)
您混淆了因JVM崩溃而引发的异常或错误。
由于JVM中的内部错误导致JVM崩溃,您无法通过编写正常的Java程序来触发(或者除非您发现错误,否则不应该触发)
您正在做的是触发错误,这意味着程序将继续运行,直到所有非守护程序线程都退出。
检查堆的最简单工具是JDK附带的VisualVM。如果要在OutOfMemoryError上触发堆转储,可以使用-XX:+HeapDumpOnOutOfMemoryError
答案 1 :(得分:1)
答案 2 :(得分:1)
当你看到下面的
Exception in thread "main" java.lang.OutOfMemoryError
这意味着您的错误或异常由异常处理程序处理。这不是崩溃。
答案 3 :(得分:0)
答案 4 :(得分:0)
查找要进行堆转储的进程ID
Save.post
通过运行以下命令运行以下命令来获取PID以生成堆转储。
ps -ef | grep java
答案 5 :(得分:0)
您可以将下面的JVM参数传递给您的应用程序:
-XX:+ HeapDumpOnOutOfMemoryError -XX:HeapDumpPath =
当您的应用程序遇到OutOfMemoryError时,此参数将自动触发指定“文件路径”中的堆转储。有7种不同的选项可用于从应用程序中进行堆转储:
有关每个选项的详细信息,请参见in this article。捕获堆转储后,可以使用Eclipse Memory Analysis tool,HeapHero之类的工具来分析捕获的堆转储。