1.基本概念
浅堆,深堆https://mp.csdn.net/mp_blog/creation/editor/141610696
2.功能概览
核心功能简介:
- Histogram:展示了各类的实例数目以及这些实例的shallow heap或Retained heap的总和。
- Dominator tree:按对象的 Retain Heap 排序,也支持按多个维度聚类统计,最常用的功能之一。
- Leak Suspects:自动检测堆dump文件,查看哪些可能泄漏的疑点,哪些对象还使用存活,为什么没有被垃圾回收。
- Thread overview:展现转储 dump 文件时线程栈帧等详细状态,也提供各线程的Retain Heap等关联内存信息。
3.界面介绍
- Leak Suspects Report(内存泄漏疑点报告-常用)
用于自动检测堆dump文件、查看可能泄漏的疑点、哪些对象还使用存活、为什么没有被垃圾回收。
- Component Report(组件报告)
用于分析一些列对象集合,包括重复字符串、空集合、弱引用、终结器等。
- Re-open previously run reports(打开一个已存在的dump报告)
4.常见功能
4.1Dominator tree
Dominator tree 快速了解各支配树起点对象所支配内存的大小,进而了解哪几个root对象是GC无法释放大内存的原因。
当个别对象支配树的 Retained Heap 很大且存在明显倾斜时,可以重点分析它们的对象支配关系,展开对应的子树进一步定位到问题根因。
样例图中可以看到是main线程中存在大对象ArrayList以及A占用98%以上的内存。
可以按照class进行分组,尽快定位大对象的原因
4.2 Histogram
该模块以直方图的方式来显示当前内存使用情况可能更加适合较为复杂的内存泄漏分析,默认直接罗列每个类实例的数量和累计内存占比,包括Shallow Heap及Retained Heap。
支持按对象数量、Retained Heap、Shallow Heap(默认排序)等指标排序;支持按正则过滤;支持按 package、class loader、super class、class 聚类统计
可以通过references快速找到占用较高内存对象的相关引用
使用场景:有些情况下, Dominator tree 无法展现出热点对象(如按 class 聚合也无明显热点对象,此时 Dominator tree 很难做关联分析判断哪类对象占比高),这时可以使用 Histogram 查看所有对象所属类的分布,快速定位占据 Retained Heap 大头的类。
使用技巧:Integer,String 和 Object[] 一般不直接导致内存问题。为更好的组织视图,可以通过 class loader 或 package 分组进一步排查问题。
4.3 Leak Suspects
当存在明显的内存泄漏时,分析完Dump文件后就会展现。查看引用链条上占用内存较多的可疑对象。这个功能可解决一些基础问题。
4.4 thread overview
该模块可以看到:线程对象/线程栈信息、线程名、Shallow Heap、Retained Heap、类加载器、是否Daemon线程等信息
在分析内存Dump的MAT中还可以看到线程栈信息