我的团队在尝试执行由OutOfMemoryErrors触发的良好堆转储时遇到了困难。由于特定的原因,我们目前正在使用从bash脚本调用的jmap进行转储,而不是使用HeapDumpOnOutOfMemoryError标志。我们正在使用堆大小约为3 GB的64位1.6 JVM。我们的堆转储在90%的时间内失败(猜测)。
我们是否可以采取任何措施来提高获得干净堆转储的可能性,以解决内存问题?我已经读到jmap在Java 1.4中存在主要问题,但是现在应该主要解决这些问题。
我的团队在尝试执行由OutOfMemoryErrors触发的良好堆转储时遇到了困难。由于特定的原因,我们目前正在使用从bash脚本调用的jmap进行转储,而不是使用HeapDumpOnOutOfMemoryError标志。我们正在使用堆大小约为3 GB的64位1.6 JVM。我们的堆转储在90%的时间内失败(猜测)。
我们是否可以采取任何措施来提高获得干净堆转储的可能性,以解决内存问题?我已经读到jmap在Java 1.4中存在主要问题,但是现在应该主要解决这些问题。
Answers:
您的操作系统是哪个?(我无法添加评论)。
对于Solaris,我们首先强制执行核心转储(gcore <pid>
),然后将jmap附加到核心转储文件(jmap -heap:format=b <path to java bin> <path to core>
),以获得更好的结果。
gcore
是* nix实用程序,用于生成正在运行的程序的映像。见链接。
这是一个相当老的问题,但我会回答,希望有人会觉得这很有用。
jmap具有-F选项(强制)。事实证明,这过去对我来说效果不佳。如果要使用-F选项,建议您也将java.io.tmp目录指定为jmap命令的一部分。JVM 1.6.22版存在一个问题,由于临时目录设置,jmap实用程序无法正常运行。
您也可以尝试通过gdb进行核心转储。拥有核心后,jmap可以将核心转换为堆转储。