JVM dump
java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因。那么dump文件的内容是什么样的呢?我们一步一步来
获取JVM dump文件
获取dump文件的方式分为主动和被动
i.主动方式:
1.利用jmap,也是最常用的方式:jmap -dump:[live],format=b,file=
2.利用jcmd,jcmd GC.heap_dump
3.使用VisualVM,可以界面操作进行dump内存
4.通过JMX的方式
MBeanServerserver=ManagementFactory.getPlatformMBeanServer();
HotSpotDiagnosticMXBean mxBean=ManagementFactory.newPlatformMXBeanProxy(server, "com.sun.management:type=HotSpotDiagnostic", HotSpotDiagnosticMXBean.class);
mxBean.dumpHeap(filePath, live);
ii.被动方式:
被动方式就是我们通常的OOM事件了,通过设置参数-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=
dump文件分析
结构示意图
结构详解
dump文件是堆内存的映射,由文件头和一系列内容块组成
文件头
由musk, 版本,identifierSize, 时间4部分组成
1、musk:4个byte,内容为'J', 'A', 'V', 'A'即JAVA
2、version:若干byte,值有以下三种
" PROFILE 1.0\0",
" PROFILE 1.0.1\0",
" PROFILE 1.0.2\0"
3、identifierSize:4个byte数字,值为4或者8,表示一个引用所占用的byte数
4、time:8个byte,dump文件生成时间
说明:java一个类的成员变量有两种类型
基本类型(8种基本类型),它们占用byte数固定不变,每生成一个对象它们就需要给它们赋初始值,分配空间
是引用类型,表示一个对象,在类中只有一个引用,引用只是一个数值,所占用的空间大小为identifierSize,被引用对象即将在堆中的另一个地方
例如定义一个类
public class Person {
private int age;//4个byte