开发、应用中老是会遇到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 进行堆转储文件分析里的介绍。