MAT排查OOM
Overview
Overview页签下分别包含了:Actions,Reports,Step By Step 三大块功能;每一块功能下的子集所对应的作用分别是:
Actions:
Histogram(直方图) 列出每个类 所对应的对象个数,以及所占用的内存大小;
Dominator Tree(支配树) 以占用总内存的百分比 的方式来列举出所有的实例对象,注意这个地方是直接列举出的对应的对象而不是类,这个视图是用来发现大内存对象的
Top Consumers:按照类和包分组的方式展示出占用内存最大的一个对象
Duplicate Classes:检测由多个类加载器所加载的类信息(用来查找重复的 类)
Reports:
Leak Suspects:通过MAT自动分析当前内存泄露的主要原因
Top Components:Top组件,列出大于总堆1%的组件的报告
Step By Step:
Component Report:组件报告,分析属于公共根包或类加载器的对象;
dominator_tree页签
- Shallow Heap(浅堆) 表示该对象自身占用的堆内存,不包括它引用的对象。
针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。 - Retained Heap(深堆) 表示当前对象大小+当前对象可直接或间接引用到的对象的大小总和。
换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。
(不过,释放的时候还要排除被GC Roots直接或间接引用的对象。他们暂时不会被被当做Garbage。)
总结
视图 1:Leak Suspects(泄漏嫌疑犯 → 最常用!)
打开后直接显示:
- 哪几个对象占了 90% 内存
- 哪行代码导致的
- 谁引用了它没释放
这就是 企业排查 OOM 第一视图。
视图 2:Histogram(直方图)
看哪个类的对象最多
例如:
- List 爆了
- User 对象 100 万个
- 自定义缓存没释放
视图 3:Dominator Tree(支配树)
看谁占用最大内存
直接排序,最大的那个就是元凶。
最关键:怎么看?(看这 3 个就够)
- 找占用最大的对象
- 右键 → Path to GC Roots → exclude all phantom/weak/soft etc.
- 看到哪行代码持有引用 → 就是 OOM 原因!
最常见 OOM 原因(MAT 一查一个准)
- List/Map 静态集合只加不删
- 全表查询 selectAll() 加载 10 万条数据
- 内存泄漏:连接未关闭、线程池不关闭、缓存不清理
- 递归创建对象
- 大文件、大报表加载到内存
最简单总结
- OOM 自动生成 hprof
- 用 MAT 打开
- 点 Leak Suspects
- 看 谁占内存最大、谁没释放
- 定位代码 → 修复
浙公网安备 33010602011771号