如何阅读heap dump文件

参考资料: http://www.importnew.com/24393.html

首先可以尝试用google-perftools查看统计结果,然后用MAT查看heap dump的详细内容。

谷歌的性能分析工具google-perftools

/usr/local/gperftools/bin/pprof --text $JAVA_HOME/bin/java /data/gperf/ worker.0001.heap
查看统计结果。

下载MAT

https://eclipse.org/mat/downloads.php
注意打开的时候要选打开heap dump,而不是open file,不然会打开失败。

术语

Retained Heap

Retained: 持有,阻拦
对象以及它所持有的其它引用(包括直接和间接)所占的总内存。

tips

1
如果A,B都持有C对象引用,则C的内存不计入A或B。

Shallow heap

Shallow: 浅
对象本身占用内存的大小,不包含其引用的对象。

  • 常规对象(非数组)的shallow size有其成员变量的数量和类型决定。
  • 数组的shallow size有数组元素的类型(对象类型、基本类型)和数组长度决定

    Shallow size最大一般是byte[], char[], int[]

Action面板的功能

Histogram

默认Shallow size排序
列出每个class的实例数量、大小(内存中的对象统计),可以查看某些对象的具体值:

进一步操作: group by package:

Dominator Tree

默认Retained Heap排序
列出最大的对象以及其依赖存活的Object。
TIPS: 这里有黄点的是GC Root。

Top Consumers

从3个角度列出最占用内存的对象,展现形式有表格和图。
三个角度: class,class loader,包。

Duplicate Class

列出由多个class loader加载的class。

图例

带有黄点的对象: GCRoot(如果是System class可以不用管)

常用操作

Path to GC Roots -> exclude weak references: 看看为啥没有回收。

List Object->With incoming reference: 看看都有谁用了这个对象;

List Object->With outcoming reference: 看看里面都有啥。

推荐文章