HeapDumpPath:%p无法正常工作

时间:2018-02-26 10:35:59

标签: java heap

我正在尝试在运行我的Java应用时分配自定义HeapDumpPath。应用了新路径,但%p占位符未被实际值替换(此处需要进程ID)。

使用%p描述了here - 寻找-XX:HeapDumpPath=./java_pid%p.hprof

我写了这个简单的应用来测试行为:

public class MainOverflow {

    public static void main(String[] args) {
        List<String> strings = new ArrayList<>();
        String last = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
        for (int i=0; i<100; i++) {
            last = last + last;
            strings.add(last);
            System.out.println(strings.size());
        }
    }
}

在标准的Oracle Java 8安装(在Linux上)上运行它:

/usr/lib/jvm/java-8-oracle$ ./bin/java \
    -XX:+HeapDumpOnOutOfMemoryError \
    -XX:HeapDumpPath=./java_pid%p.hprof \
    -classpath jre/lib/rt.jar:/path/to/project/target/classes \
    package.name.MainOverflow

但结果是:

  

...

     

java.lang.OutOfMemoryError:Java堆空间

     

将堆转储到./java_pid%p.hprof ...

预期会有类似./java_pid2504.hprof的内容。所以,问题是:我做错了什么?

2 个答案:

答案 0 :(得分:2)

您始终可以将堆转储路径设置为指向目录,并在OnOutOfMemoryError选项中添加命令:

-XX:HeapDumpPath="heapdumps/"
-XX:OnOutOfMemoryError="..."

根据JVM troubleshooting guide by Oracle,您可以在%p选项中使用-XX:OnOutOfMemoryError

因此,我会尝试这样的事情(假设堆转储的自定义位置和默认文件名):

 -XX:OnOutOfMemoryError="mv heapdumps/java_pid%p.hprof heapdumps/myenv_heapdump_%p.hprof"

答案 1 :(得分:1)

Java 8 答案。[2021 年 5 月 17 日测试]

您只需要在 -XX:HeapDumpPath 选项中提供目录名称。

因此,如果您的目录是:C:/work/myCustomFolder,只需提供:-XX:HeapDumpPath="C:/work/mycustomFolder"。将在此文件夹中创建一个名为“java_pid1234.hprof”的文件。 (1234 只是 pid 的一个例子。)