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 个就够)

  1. 找占用最大的对象
  2. 右键 → Path to GC Roots → exclude all phantom/weak/soft etc.
  3. 看到哪行代码持有引用 → 就是 OOM 原因!

最常见 OOM 原因(MAT 一查一个准)

  1. List/Map 静态集合只加不删
  2. 全表查询 selectAll() 加载 10 万条数据
  3. 内存泄漏:连接未关闭、线程池不关闭、缓存不清理
  4. 递归创建对象
  5. 大文件、大报表加载到内存

最简单总结

  1. OOM 自动生成 hprof
  2. MAT 打开
  3. Leak Suspects
  4. 谁占内存最大、谁没释放
  5. 定位代码 → 修复
posted @ 2026-07-01 22:45  景之1231  阅读(11)  评论(0)    收藏  举报