我正在尝试在运行Java应用程序时分配自定义HeapDumpPath。将应用新路径,但%p占位符不会替换为实际值(此处应为进程ID)。

here描述了%p的使用-查找-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这样的东西是可以预期的。所以,问题是:我在做什么错?

最佳答案

您始终可以将堆转储路径设置为指向目录,并在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"

关于java - HeapDumpPath:%p无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48986432/

10-10 10:54