我正在尝试在运行我的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的内容。所以,问题是:我做错了什么?
答案 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)
您只需要在 -XX:HeapDumpPath
选项中提供目录名称。
因此,如果您的目录是:C:/work/myCustomFolder,只需提供:-XX:HeapDumpPath="C:/work/mycustomFolder"
。将在此文件夹中创建一个名为“java_pid1234.hprof”的文件。 (1234 只是 pid 的一个例子。)