我正在尝试在运行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/