outOfMemory内存溢出
内存溢出,导入溢出快照后如下,
这里需要注意观察下面的内存加起来应该是需要等于jvm设置的最大内存,如果小于jvm的最大内存说明没有内存溢出,这里内存设置1G,总共内存是837MB,但是这里的.hprof文件大小有1.2G,因此可以通过.hprof文件大小来识别是否真的内存溢出了
这里为什么AMT显示的总内存大小小于jvm设置的大小呢?
原因是pay-manage.hprof 额外包含的内容如下:
除了对象数据,.hprof 还会保存:
类定义元数据(类名、字段信息、方法签名等)。
对象 ID 映射表(对象在 dump 中的唯一编号,用于引用关系)。
线程栈帧、锁信息。
压缩/对齐开销(很多实现会对齐到 8 字节)。
这些信息在 MAT 打开后通常不会计入 “Heap Usage”,所以你看到的数值比文件小。
反面示例,这里内存才238远远小于jvm设置的4G内存,所以这里是没有发生内存溢出的
大对象内存占用分布
内存分析菜单
1)内存分析数据概览菜单
2)内存对象占用详情
内存对象占用详情中找到最大的对象,然后查看它的GCroot对象
3)显示每个线程的名称、堆栈、帧本地值、保留堆等;这里找到最终内存泄漏的位置
查看打对象引用的菜单,通过打对象找到业务代码引用的位置