JVM系列:Dump文件的生成和分析
2019-01-30 本文已影响15人
黄靠谱
概括
Dump包分析是JVM问题排查的杀手锏啦,直接定位到大对象所在的类,为问题排查提供最直接的指导
Dump文件的生成
- jmap命令生成: jmap -dump:live,file=dump_001.bin PID
- 监控工具生成:jvisualvm 工具里面有 Heap Dump的功能
- jvm参数的配置: 比如FullGC的时候生成dump包
- HeapDumpBeforeFullGC :实现在Full GC前dump。
- HeapDumpAfterFullGC :实现在Full GC后dump。
- HeapDumpPath :设置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();
}
//循环添加对象到缓存
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文件导入到jvisualvm中
- 根据size进行排序,查看大的对象
- 根据size/百分比得到当前 堆区的大小
- 当前最大的对象: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