利用Java heap dump查找、分析问题
开发、应用中老是会遇到OutOfMemory异常,而且常常是过一段时间内存才被吃光,这里可以利用java heap dump出jvm内存镜像,然后再对其进行分析来查找问题。
《java heap dump触发和分析》这篇文章很好的介绍了heap dump的方法和分析的工具。
平常利用jmap -dump:format=b,file=/path/file.hprof <pid> 这个java自带的工具来dump heap很方便,但当内存溢出问题发生的比较快的情况下,该命令就有可能来不及或无效。
这个时候在应用启动时配置相关的参数 -XX:+HeapDumpOnOutOfMemoryError就比较方便,当然可以再加上-XX:HeapDumpPath=/path/file.hprof 来指定文件的输出路径。
不知道怎么用这些参数?就在你启动应用的时候加,如:
/usr/lib/jvm/java-1.6.0/bin/java -server -Xms1536m -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=64m -XX:MaxPermSize=64m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/file.hprof -Djava.ext.dirs=/xxx/lib/ ClassName
在《java heap dump触发和分析》里有介绍到分析工具,个人觉得利用java自带的 $JAVA_HOME/bin/jhat -J-Xmx512m /path/file.hprof工具看分析结果不是很友好,当然这情况紧急、身边又没工具的情况下也是一个好的选择。但个别比较推荐里面介绍的IBM HeapAnalyzer(没用过)和MemoryAnalyzer,关于MemoryAnalyzer的介绍可以看下使用 Eclipse Memory Analyzer 进行堆转储文件分析里的介绍。