概括
Dump包分析是JVM問題排查的殺手锏啦,直接定位到大對象所在的類,為問題排查提供最直接的指導(dǎo)
Dump文件的生成
- jmap命令生成: jmap -dump:live,file=dump_001.bin PID
- 監(jiān)控工具生成:jvisualvm 工具里面有 Heap Dump的功能
- jvm參數(shù)的配置: 比如FullGC的時候生成dump包
- HeapDumpBeforeFullGC :實(shí)現(xiàn)在Full GC前dump。
- HeapDumpAfterFullGC :實(shí)現(xiàn)在Full GC后dump。
- HeapDumpPath :設(shè)置Dump保存的路徑
Java ... -XX:+HeapDumpBeforeFullGC -XX:+HeapDumpAfterFullGC -XX:HeapDumpPath=e:\dump testgc.Main
Dump文件的jvisualvm分析
測試代碼:制造一個大的HashMap對象
public class TestMain {
//聲明緩存對象
private static final Map map = new HashMap();
public static void main(String args[]){
try {
Thread.sleep(10000);//給打開visualvm時間
} catch (InterruptedException e) {
e.printStackTrace();
}
//循環(huán)添加對象到緩存
for(int i=0; i<4000000;i++){
TestMemory t = new TestMemory();
map.put("key"+i,t);
}
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("qqqq");
}
}
class TestMemory{
public String name="huangzs";
public String address="huangzs_jiujiangshi_jiangxisheng";
}
先把Dump文件導(dǎo)入到j(luò)visualvm中
- 根據(jù)size進(jìn)行排序,查看大的對象
- 根據(jù)size/百分比得到當(dāng)前 堆區(qū)的大小
- 當(dāng)前最大的對象:multiThread.TestMain ,也就是 multiThread包下的TestMain這個類,占了19%堆的大小
- 堆中對象占用空間最大的對象類型是 java.util.HashMap$Entry,也就是HashMap有很多的Entry
-
最大的java.util.HashMap編號是 174
image
大對象分析
- 對象編號174 ,占用空間 67108888b % (1024*1024)=64M
- 這個對象是被 TestMain這個類的 map這個屬性引用的
-
另外左邊的小框框的右上角 提供按照 size排序的功能
image

