type
status
date
slug
summary
tags
category
icon
password
1. MAT 工具简介
MAT(全名:Memory Analyzer Tool),是一款快速便捷且功能强大丰富的 JVM 堆内存离线分析工具。其通过展现 JVM 异常时所记录的运行时堆转储快照(Heap dump)状态(正常运行时也可以做堆转储分析),帮助定位内存泄漏问题或优化大内存消耗逻辑。
1.1 MAT 使用场景及主要解决问题
场景一:内存溢出,JVM堆区或方法区放不下存活及待申请的对象。如:高峰期系统出现 OOM(Out of Memory)异常,需定位内存瓶颈点来指导优化。
场景二:内存泄漏,不会再使用的对象无法被垃圾回收器回收。如:系统运行一段时间后出现 Full GC,甚至周期性 OOM 后需人工重启解决。
场景三:内存占用高。如:系统频繁 GC ,需定位影响服务实时性、稳定性、吞吐能力的原因。
1.2 基础概念
1.2.1 Heap Dump
Heap Dump 是 Java 进程堆内存在一个时间点的快照,支持 HPROF 及 DTFJ 格式,前者由 Oracle 系列 JVM 生成,后者是 IBM 系列 JVM 生成。其内容主要包含以下几类:
- 所有对象的实例信息:对象所属类名、基础类型和引用类型的属性等。
- 所有类信息:类加载器、类名、继承关系、静态属性等。
- GC Root:GC Root 代表通过可达性分析来判定 JVM 对象是否存活的起始集合。JVM 采用追踪式垃圾回收(Tracing GC)模式,从所有 GC Roots 出发通过引用关系可以关联的对象就是存活的(且不可回收),其余的不可达的对象(Unreachable object:如果无法从 GC Root 找到一条引用路径能到达某对象,则该对象为Unreachable object)可以回收。
- 线程栈及局部变量:快照生成时刻的所有线程的线程栈帧,以及每个线程栈的局部变量。
1.2.2 Shallow Heap
Shallow Heap 代表一个对象结构自身所占用的内存大小,不包括其属性引用对象所占的内存。如 java.util.ArrayList 对象的 Shallow Heap 包含8字节的对象头、8字节的对象数组属性 elementData 引用 、 4字节的 size 属性、4字节的 modCount 属性(从 AbstractList 继承及对象头占用内存大小),有的对象可能需要加对齐填充但 ArrayList 自身已对齐不需补充,注意不包含 elementData 具体数据占用的内存大小。
1.2.3 Retained Set
一个对象的 Retained Set,指的是该对象被 GC 回收后,所有能被回收的对象集合(如下图所示,G的 Retain Set 只有 G 并不包含 H,原因是虽然 H 也被 G 引用,但由于 H 也被 F 引用 ,G 被垃圾回收时无法释放 H);另外,当该对象无法被 GC 回收,则其 Retained set 也必然无法被 GC 回收。
1.2.4 Retained Heap
Retained Heap 是一个对象被 GC 回收后,可释放的内存大小,等于释放对象的 Retained Heap 中所有对象的 Shallow Heap 的和(如下图所示,E 的 Retain Heap 就是 G 与 E 的 Shallow Heap 总和,同理不包含 H)。
1.2.5 Dominator tree
如果所有指向对象 Y 的路径都经过对象 X,则 X 支配(dominate) Y(如下图中,C、D 均支配 F,但 G 并不支配 H)。Dominator tree 是根据对象引用及支配关系生成的整体树状图,支配树清晰描述了对象间的依赖关系,下图左的 Dominator tree 如下图右下方支配树示意图所示。支配关系还有如下关系:
- Dominator tree 中任一节点的子树就是被该节点支配的节点集合,也就是其 Retain Set。
- 如果 X 直接支配 Y,则 X 的所有支配节点均支配 Y。
1.2.6 OQL
OQL 是类似于 SQL 的 MAT 专用统一查询语言,可以根据复杂的查询条件对 dump 文件中的类或者对象等数据进行查询筛选。
1.2.7 references
outgoing references、incoming references 可以直击对象间依赖关系,MAT 也提供了链式快速操作。
- outgoing references:对象引用的外部对象(注意不包含对象的基本类型属性。基本属性内容可在 inspector 查看)。
- incoming references:直接引用了当前对象的对象,每个对象的 incoming references 可能有 0 到多个。
1.2.8 GC Root
GC Roots 是一组必须活跃的引用。GC 会收集那些不是 GC Roots 且没有被GC roots引用的对象。基本思路就是通过一系列名为GC Roots 的对象作为起始点开始向下搜索。如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用,就可进行回收。
哪些对象可以作为Gc Roots的对象:
- Class – 由系统类加载器(system class loader)加载的对象,这些类是不能够被回收的,例如基本数据类型对应的 Class 对象、一些常驻的异常对象(如:NullPointerException、OutOfMemoryError) 、系统类加载器。他们可以以静态字段的方式保存持有其它对象。我们需要注意的一点就是,通过用户自定义的类加载器加载的类,除非相应的 java.lang.Class 实例以其它的某种(或多种)方式成为 roots,否则它们并不是 roots。
- Thread – 活着的线程
- Stack Local – Java 方法的 local 变量或参数
- JNI Local – JNI 方法的 local 变量或参数
- JNI Global – 全局 JNI 引用
- Monitor Used – 所有被同步锁synchronized持有的对象
- JMXBean、JVMTI中注册的回调、本地代码缓存等
2. MAT 功能概述及对比
2.1 MAT 功能概述
MAT 的工作原理是对 dump 文件建立多种索引,并基于索引来实现
- [1]内存分布
- [2]对象间依赖(如实体对象引用关系、线程引用关系、ClassLoader引用关系等)
- [3]对象状态(内存占用量、字段属性值等)
- [4]条件检索(OQL、正则匹配查询等)
这四大核心功能,并通过可视化展现辅助 Developer 精细化了解 JVM 堆内存全貌。
2.1.1 内存分布
- 全局概览信息:堆内存大小、对象个数、类的个数、类加载器的个数、GC root 个数、线程概况等全局统计信息。
- Dominator tree:按对象的 Retain Heap 排序,也支持按多个维度聚类统计,最常用的功能之一。
- Histogram:罗列每个类实例的内存占比,包括自身内存占用量(Shallow Heap)及支配对象的内存占用量(Retain Heap),支持按 package、class loader、super class、class 聚类统计,最常用的功能之一。
- Leak Suspects:直击引用链条上占用内存较多的可疑对象,可解决一些基础问题,但复杂的问题往往帮助有限。
- Top Consumers:展现哪些类、哪些 class loader、哪些 package 占用最高比例的内存。
2.1.2 对象间依赖
- References:提供对象的外部引用关系、被引用关系。通过任一对象的直接引用及间接引用详情(主要是属性值及内存占用),进而提供完善的依赖链路详情。
- Dominator tree:支持按对象的 Retain Heap 排序,并提供详细的支配关系,结合 references 可以实现大对象快速关联分析;
- Thread overview:展现转储 dump 文件时线程栈帧等详细状态,也提供各线程的 Retain Heap 等关联内存信息。
- Path To GC Roots:提供任一对象到GC Root的链路详情,帮助了解不能被 GC 回收的原因。
2.1.3 对象状态
- 最核心的是通过 inspector 面板提供对象的属性信息、类继承关系信息等数据,协助分析内存占用高与业务逻辑的关系。
- 集合状态的检测,如:通过 ArrayList 或数组的填充率定位空集合空数组造成的内存浪费、通过 HashMap 冲突率判定 hash 策略是否合理等。
2.1.4 按条件检索对象
- OQL:提供一种类似于SQL的对象(类)级别统一结构化查询语言。例如
- 查找 size=0 且未使用过的 ArrayList:
select * from java.util.ArrayList where size=0 and modCount=0
- 查找所有的 String 的 length 属性的:
select s.length from instanceof String s
- 内存分布及对象间依赖的众多功能,均支持按字符串检索、按正则检索等操作。
- 按虚拟内存地址寻址,根据对象的十六进制地址查找对象。
此外,为了便于记忆与回顾,整理了如下脑图:
2.2 常见内存分析工具对比
下图中 Y 表示支持,N 表示不支持,时间截至发稿前。
产品功能 | MAT | JProfiler | Visual VM | jhat | jmap | hprof |
对象关联分析、深浅堆、GC ROOT、内存泄漏检测、线程分析、提供自定义程序扩展扩展 | Y | N | N | N | N | N |
离线全局分析 | Y | N | Y | Y | N | N |
内存实时分配情况 | N | Y | Y | Y | Y | Y |
OQL | Y | N | Y | N | N | N |
内存分配堆栈、热点比例 | N | Y | N | N | N | N |
堆外内存分析 | N | N | N | N | N | N |
注 1:Dump 文件包含快照被转储时刻的 Java 对象 在堆内存中的分布情况,但快照只是瞬间的记录,所以不包含对象在何时、在哪个方法中被分配这类信息。
注 2:一般堆外内存溢出排查可结合 gperftools 与 btrace 排查,此类文章较多不展开介绍。
3. Quick Start 及使用技巧
3.1 Quick Start
- 安装 MAT:戳【下载链接】;也可直接集成到 Eclipse IDE中(路径:Eclipse → Help → Eclipse Marketplace → 搜 “MAT”)。
- 调节 MAT 堆内存大小:MAT 分析时也作为 Java 进程运行,如果有足够的内存,建议至少分配 dump 文件大小*1.2 倍的内存给 MAT,这样分析速度会比较快。方式是修改 MemoryAnalyer.ini 文件,调整Xmx参数(Windows 可用搜索神器 everything 软件查找并修改、MAC OS 一般在
/Applications/mat.app/Contents/Eclipse/MemoryAnalyzer.ini
,如找不到可用 Alfred 软件查询修改)。
- 获取堆快照 dump 文件(堆转储需要先执行 Full GC,线上服务使用时请注意影响),一般用三种方式:
- 使用 JDK 提供的 jmap 工具
- 常规命令是
jmap -dump:format=b,file=文件名.hprof 进程号
- 也可以只打印存活对象,这样可以大大减少文件的体积
jmap -dump:live,format=b,file=文件名.hprof 进程号
- 当进程接近僵死时,可以添加 -F 参数强制转储
jmap -F -dump:format=b,file=文件名.hprof 进程号
- 本地运行的 Java 进程,直接在 MAT 使用 File → accquire heap dump 功能获取。
- 启动 Java 进程时配置 JVM 参数
-XX:-HeapDumpOnOutOfMemoryError,-XX:HeapDumpPath=文件路径
,当发生 OOM 时无需人工干预会自动生成 dump文件到指定目录。
- 分析 dump 文件:路径是 File → Open Heap Dump ,然后 MAT 会建立索引并分析,dump 文件较大时耗时会很长。分析后 dump 文件所在目录会有后缀为 index 的索引文件,也会有包含 HTML 格式的后缀为 zip 的文件。
- 完成索引计算后,MAT 呈现概要视图(Overview),包含三个部分:
- 全局概览信息,堆内存大小、类数量、实例数量、Class Loader数量。
- Unreachable Object Histogram,展现转储快照时可被回收的对象信息(一般不需要关注,除非 GC 频繁影响实时性的场景分析才用到)
- Biggest Objects by Retained Size,展现经过统计过的哪几个实例所关联的对象占内存总和较高,以及具体占用的内存大小,一般相关代码比较简单情况下,往往可以直接分析具体的引用关系异常,如内存泄漏等。此外也包含了最大对象和链接支持继续深入分析。
6、如果代码比较复杂,需要继续使用 MAT 各种工具并结合业务代码进一步分析内存异常的原因。最常用的几项如下
- 查看堆整体情况的:Histogram、Dominator tree、Thread details等(各功能入口整理如下)
- MAT 分析过的 Top Consumers 、Leak Suspects等。
3.2 使用技巧及注意事项
1、注意对运行进程的性能影响:Heap dump 时会先进行 Full GC,另外为保证对象数据视图一致,需要在安全点 Stop The World 暂停响应,线上服务进行务必注意性能影响。可以采取以下技巧减少影响:
- 先禁用入口流量,再执行 dump 动作。
- 选择影响较小时 dump 内存。
- 使用脚本捕获指定事件时 dump 内存。
2、Dump 文件及建立的索引文件可能较大,如果开发机配置不足无法分析,可在服务器先执行分析后,基于分析后的索引文件直接查看结果,另外也需要注意磁盘占用问题:
- 大文件分析方法:一般 dump 文件不高于分析机主存 1.2 倍可直接在开发机分析;若 dump 文件过大,可以使用 MAT 提供的脚本在配置高的高配机器先建立索引再直接展现索引分析结果(一般是 Linux 机器,可以使用 MAT 提供的脚本:./ParseHeapDump.sh $HEAPDUMP,堆信息有 unreachable 标记的垃圾对象,在 dump 时也保存了下来,默认不分析此部分数据,如需要在启动脚本 ParseHeapDump.sh 中加入:-keep_unreachable_objects)。
- 如果不关注堆中不可达对象,使用
live
参数可以减小文件大小,命令是jmap -dump:live,format=b,file=<dumpfile> <pid>
- Dump 前主动手动执行一次 FULL GC ,去除无效对象进一步减少 dump 堆转储及建立索引的时间。
- Dump文件巨大,建立索引后发现主视图中对象占用内存均较小,这是因为绝大部分对象未被 GC Roots 引用可释放。
- Dump 时注意指定到空间较大的磁盘位置,避免打满分区影响服务。
- 建立 dump 索引机器的磁盘空间需要足够大,一般至少是 dump 文件的两倍,因为生成的中间索引文件也较大,如下图:
3、其他
- JDK 版本问题:如遇“VMVersionMismatchException”,使用启动目标进程的 JDK 版本即可。
- 部分核心功能主界面未展现,问题足够复杂时需打开,如 MAT 默认不打开 inspector,如需根据对象数据值做业务分析,建议打开该视图。
- 配置了 HeapDumpOnOutOfMemoryError 参数,但 OutOfMemoryError 时但没有自动生成 dump 文件,可能原因有三个:
- 应用程序自行创建并抛出 OutOfMemoryError
- 进程的其他资源(如线程)已用尽
- C 代码(如 JVM 源码)中堆耗尽,这种可能由于不同的原因而出现,例如在交换空间不足的情况下,进程限制用尽或仅地址空间的限制,此时 dump 文件分析并无实质性帮助。
4. MAT功能详解
4.1 MAT界面介绍
4.1.1 区域一:Inspector区域
用于展示指定对象的详细信息(选定一个对象的时候),从上到下依次是:内存地址、加载器名称、包名、对象名称、对象所属类的父类、对象所属类的加载器对象对象的堆内存大小(shallow size)、保留大小(retained size)、gc roots信息。
4.1.2 区域二:Inspector区域下方的区域
展示对象的一些属性信息、类层级信息。
4.1.3 区域三:常用工具栏区域
常用工具按钮从左到右依次是:概览(Overview)、类直方图(Histogram)、支配树(Dominator Tree)、OQL查询、线程视图、报告相关、详细功能(提供了一些更细致的分析能力)。
4.1.4 区域四:功能视图区域
根据选择的功能不同,该区域显示对应功能的详细信息。比如我们想看Overview信息(点击区域三常用工具栏的第一个按钮)该区域就会展示heap dump Overview对应的信息。
4.2 Overview视图
进入Overview视图
- 使用MAT打开一个heap dump文件,解析完成后,默认就会进入Overview视图页面。
- 工具栏中点击Overview按钮(区域三常用工具栏的第一个按钮)展示Overview对应的信息。
Overview视图使用
Overview视图界面包括两个部分:一个是对heap dump文件的一个大致的分析,包括占用内存大小,类个数,对象个数,类加载器个数,及用饼图的方式展示对象retained size信息、另一个是提供了一些常用的入口,包括视图入口(Actions)、常用的分析报告入口(Reports)、MAT使用教程入口(Step By Step)]。
关于Overview视图区域,我们得关注点应该放在饼图上(根据retained size 对所有对象做排序,使用拼图演示结果)。我们可以方便的看到哪些对象的ratained size比较大(如果某个对象的retained size特别大。我们就要特别小心了,可能有问题了)。当我们鼠标点击每个饼图区域(对象)的时候,会弹出一个菜单,我们还可以查看相应对象的详细信息。这个菜单包含的额内容有:
- List objects
- with ontgoing references:查看当前对象持有的外部对象引用。
- with incoming references:查看当前对象被那些外部对象所引用。
- Show objects by class
- with ontgoing references:查看这个对象类型持有的外部对象引用
- with ontgoing references:查看这个对象类型被哪些外部对象引用
- Path To GC Roots: 从对象到GC Roots的路径。这个路径解释了为什么当前对象还能存活,对分析内存泄露很有帮助。(这个查询只能针对单个对象使用)。
- with all references: 从GC Roots节点到该对象的引用路径,包含所有引用类型。
- exclude weak references:从该对象到GC Roots节点的最短引用路径,去除弱引用。
- exclude soft references:从该对象到GC Roots节点的最短引用路径,去除软引用。
- exclude pahantorn references:从该对象到GC Roots节点的最短引用路径,去除虚引用。
- exclude weak/soft references:从该对象到GC Roots节点的最短引用路径,去除弱引用,软引用。
- exclude phantom/soft references:从该对象到GC Roots节点的最短引用路径,去除虚引用,软引用。
- exclude phantom/weak references:从该对象到GC Roots节点的最短引用路径,去除虚引用,弱引用。
- exclude all phantom/weak/soft etc. references:从该对象到GC Roots节点的最短引用路径,去除虚引用,弱引用,软引用。
- exclude custom references:从该对象到GC Roots节点的最短引用路径,去除自定义引用。
强引用(strong reference): 大家平常写代码的引用都是这种类型的引用,它可以防止引用的对象被垃圾回收。软引用(soft reference): 内存溢出之前进行回收,GC时内存不足时回收,如果内存足够就不回收。弱引用(weak reference): 每次GC时回收,无论内存是否足够。虚引用(phantom reference):每次垃圾回收时都会被回收,主要用于监测对象是否已经从内存中删除。
- Merge Shortest Paths to GC Roots: 从GC Roots到对象的共同路径。
- Java Basics:
- References: 显示引用和对象的统计信息,列出类加载器,包括定义的类
- Class Loader Explorer: 列出选定对象的类装载器,包括其定义的类 。
- Customized Retained Set: 计算选中对象的保留堆,排除指定的引用。
- Group By Value: 按对象的字符串表示形式对其进行分组。
- Open In Domainator Tree: 对选中对象生成支配树。
- Show As Histogram: 展示任意对象的直方图。
- leak Identification:内存泄露识别。
- Export Snapshot: 导出快照信息。
- Immediate Dominators: 查看某个对象的dominator
- Show Retained Set: 计算一个对象的保留堆大小
- Copy: 拷贝一些属性。
- Search Queries: 搜索查询相关。
4.3 Histogram视图
进入Histogram视图
- 工具栏中点击Histogram按钮(区域三常用工具栏的第二个按钮)。
- Overview页面的Actions部分有进入Histogram视图的快捷方式。
Histogram视图使用
Histogram视图从Class类的维度展示每个Class类的实例存在的个数、 占用的Shallow内存和Retained内存大小。
咱们从Histogram视图可以看出,哪个Class类的对象实例数量比较多,以及占用的内存比较大,不过,多数情况下,在Histogram视图看到实例对象数量比较多的类都是一些基础类型,如char[](因为其构成了String)、String、byte[],所以仅从这些是无法判断出具体导致内存泄露的类或者方法的,可以使用 List objects 或 Merge Shortest Paths to GC roots 等功能继续钻取数据。如果Histogram视图展示的数量多的实例对象不是基础类型,是有嫌疑的某个类,如项目代码中的bean类型,那么就要重点关注了。
如果存在内存溢出,时间久了溢出类的实例数量或者内存占比会越来越多,排名也越来越靠前的。可以点击工具类上的对比图标进行对比,通过多次对比不同时间点下的直方图对比就很容易把溢出的类找出来。
每个类的详细信息(鼠标右键某个类的时候弹出框)
- List objects:
- with ontgoing references:查看当前类的所有对象,并且列出这些对象持有的外部对象引用。
- with incoming references:查看当前类的所有对象,并且列出这些对象被那些外部对象所引用。
- Show objects by class
- with ontgoing references: 查看这个对象类型持有的外部对象引用
- with ontgoing references: 查看这个对象类型被哪些外部对象引用
- Merge Shortest Paths to GC Roots: 从GC Roots到对象的共同路径。
- Java Basics:
- References: 显示引用和对象的统计信息,列出类加载器,包括定义的类
- Class Loader Explorer: 列出选定对象的类装载器,包括其定义的类 。
- Customized Retained Set: 计算选中对象的保留堆,排除指定的引用。
- Group By Value: 按对象的字符串表示形式对其进行分组。
- Open In Domainator Tree: 对选中对象生成支配树。
- Show As Histogram: 展示任意对象的直方图。
- Java Collections
- Array Fill Ratio: 输出数组中,非基本类型、非null对象个数占数组总长度的比例。
- Arrays Grouped By Size: 显示数组的直方图,按大小分组。
- leak Identification:内存泄露识别。
- Export Snapshot: 导出快照信息。
- Immediate Dominators: 查看某个对象的dominator
- Show Retained Set: 计算一个对象的保留堆大小
- Copy: 拷贝一些属性。
- Search Queries: 搜索查询相关。
- Calculate Minimum Retained Size(quick approx.): 计算最小的Ratined Size。
- Calculate Precise Ratined Size: 精确计算Ratined Size。
4.4 Dominator Tree视图
进入Dominator Tree视图
- 工具栏中点击Dominator Tree按钮(区域三常用工具栏的第三个按钮)。
- Overview页面的Actions部分有进入Dominator Tree视图的快捷方式。
Dominator Tree视图使用
Dominator Tree视图中列出了每个对象(Object Instance)与其引用关系的树状结构,同时包含了占用内存的大小和百分比。通过Dominator Tree视图可以很容易的找出占用内存最多的几个对象(根据Retained Heap或Percentage排序)。Histogram视图和Dominator Tree视图都是可以用来帮助我们定位溢出源的。前者是基于类的角度,后者是基于对象实例的角度。Dominator Tree视图可以更方便的看出其引用关系。
4.5 Top Consumers视图
进入Top Consumers视图
- Overview页面的Actions部分有进入Top Consumers视图的快捷方式。
Top Consumers视图使用
Top Consumers视图以图形化的方式列出最大的object,可以按照object、class、classloader和package进行group by。说白了就是方便我们通过不同的方式站到占内存最大的对象。
- 按照对象查看内存占用
- 按照类查看内存占用
- 按照类加载查看内存占用
- 按照包名查看内存占用(根据包我们知道哪些公共用的到jar或自己的包占用。这样就可以看到包和包中哪些类的占用比较高)
4.6 Duplicate Classes视图
进入Duplicate Classes视图
- Overview页面的Actions部分有进入Duplicate Classes视图的快捷方式。
Duplicate Classes视图使用
Duplicate Classes视图列出了被加载多次的类,结果按类加载器进行分组,目标是加载同一个类多次被类加载器加载。使用Duplicate Classes视图很容易找到部署应用的时候使用了同一个库的多个版本的问题。
4.7 Leak Suspects
进入Leak Suspects
- 使用MAT打开一个dump文件的时候,会弹出向导菜单,保持默认选项,点Finish,就会导向 Leak Suspects内存泄露报告页面。
- 工具栏中点击Run Expect System Test > Leak Suspects按钮(区域三常用工具栏的第六个按钮)。
- Overview页面的Reports部分有进入Leak Suspects的快捷方式
Leak Suspects使用
Leak Suspects 列出了MAT帮我们分析的可能有内存泄露嫌疑的地方。MAT工具分析了heap dump文件之后非常直观的展示了一个饼图,饼图深色区域被怀疑有内存泄漏的地方。而且下面会给出对怀疑内存泄露地方的具体描述信息。
针对MAT帮我们分析出来的可能有内存泄露的地方。我们也可以进入查看怀疑地方的详细信息(Leak Suspects如果有怀疑的地方)。
- Description: 对怀疑内存泄露地方的一个描述信息。
- Shortest Paths To the Accumulation Point: 展示怀疑内存泄露对象的Path to GC Roots(就是持有可能泄漏内存对象的最近一层)。这个视图的作用是可以分析是由于和哪个GC root相连导致当前Retained Heap占用相当大的对象无法被回收。由于是分析内存泄露的报告,找到导致当前对象无法被回收的GC roots,分析这些GC roots是否合理,是有必要的。
- Accumulated Objects in Dominator Tree:以对象的维度展示了以怀疑对象为根的Dominator Tree支配树。 可以方便的看出受当前对象“支配”的对象中哪个占用Retained Heap比较大。
- Accumulated Objects by Class in Dominator Tree:展示了以对象对象为根的Dominator Tree支配树,并以Class类分组。
- All Accumulated Objects by Class:列举了怀疑对象所存储的所有内容。
4.8 Top Components
进入 Top Components
- 工具栏中点击Run Expect System Test > Top Components按钮(区域三常用工具栏的第六个按钮)。
- Overview页面的Reports部分有进入Top Components的快捷方式
Top Components使用
可以针对那些占用堆内存超过整个堆内存1%大小的组件做一系列的分析。
如上图所示,列出报告中总内存占用大于1%的组件。点击每个组件。有可以查看每个组件的详细信息。如下图所示(点击组件之后进入):
- 饼图:展示内存占用大小。
- Top Consumers:以图形化的方式列出最大的object,上文中有讲到Top Consumers哦
- Retaines Set:是这个对象本身和他持有引用的对象和这些对象的retained set所占内存大小的总和。
- Possible Memory Waste:可能的内存垃圾。有一下几个部分。
- Duplicate Strings: 重复的字符串。
- Empty Collections: 空集合。
- Collection Fill Ratios: 集合使用率。
- Miscellaneous:
- Soft Reference Statistics: 软引用统计。
- Weak Reference Statistics: 弱引用统计。
- Finalizer Statistics: Finalizer统计(设计Java Finalizer的使用)。
- Map Collision Ratios: Map碰撞比例。
Leak Suspects用于查找内存泄漏问题,Top Components负责分析占用堆内存超过整个堆内存1%大小的组件。
4.9 线程视图
线程视图首先给出了在生成快照那个时刻,JVM中的Java线程对象列表。
进入线程视图
- 工具栏中点击线程视图按钮。
线程视图的使用
在线程视图这个表中,可以看到以下几个信息:线程对象的名字、线程名、线程对象占用的堆内存大小、线程对象的保留堆内存大小、线程的上下文加载器、是否为守护线程。
选中某个线程对象展开,可以看到线程的调用栈和每个栈的局部变量,通过查看线程的调用栈和局部变量的内存大小,可以找到在哪个调用栈里分配了大量的内存。
参考
- Author:mcbilla
- URL:http://mcbilla.com/article/982c73b9-bf3c-4e10-9531-0947398e8a3d
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts