同事让帮忙分析一个程序问题,程序运行后内存一直在涨。
先使用jmap命令抓取进程的内存信息
jmap -dump:live,format=b,file=dump.hprof 进程号
使用eclipse的merroy analysis 插件打开4个G的dump文件,发现内存使用并不是很大,但是注意到上面有unreachable objects histogram是未统计在内的。
点击设置Merroy Analyzer,勾选上keep unreachable objects,重新打开dump文件进行分析,发现有3G未gc内存占用。
查看histogram,按照heap排序,忽略char[]和string,排第三位的为StackTraceElement
选择Merge Shortest Paths to GC Roots,查看具体内容
根据显示的内容定位到代码及行号,最后发现是一个只需要初始化一次的对象反复进行了初始化操作导致的。
修改代码为初始化一次,问题解决。
以前虽然分析过不少内存问题,但是unreachable objects的内存问题还是第一次遇到,中间切换了不少内存分析工具进行分析,经历了一些波折,就此记录一下。