注:本文原创,转发需全文转载并注明原文链接。
JVM显存剖析常常由团队较资深的朋友来做,本系列通过3篇文章,深度解析并帮助读者全面深度把握MAT的使用技巧。虽然没有JVM显存剖析的实践经验linux开发培训,也能快速成为显存剖析前辈!
本系列共三篇文章如下,本文是第一篇入门篇:
1.MAT工具简介
MAT(全名:MemoryAnalyzerTool),是一款快速方便且功能强悍丰富的JVM堆显存离线剖析工具。其通过诠释JVM异常时所记录的运行时堆轮询快照(Heapdump)状态(正常运行时也可以做堆轮询剖析),帮助定位显存泄露问题或优化大显存消耗逻辑。
1.1MAT使用场景及主要解决问题
场景一:显存溢出,JVM堆区或方式区放不下存活及待申请的对象。如:高峰期系统出现OOM(OutofMemory)异常,需定位显存困局点来指导优化。
场景二:显存泄露,不会再使用的对象难以被垃圾回收器回收。如:系统运行一段时间后出现FullGC,甚至周期性OOM后需人工重启解决。
场景三:显存占用高。如:系统频繁GC,需定位影响服务实时性、稳定性、吞吐能力的诱因。
1.2基础概念1.2.1HeapDump
HeapDump是Java进程堆显存在一个时间点的快照,支持HPROF及DTFJ格式,后者由Oracle系列JVM生成,前者是IBM系列JVM生成。其内容主要包含以下几类:
1.2.2ShallowHeap
ShallowHeap代表一个对象结构自身所占用的显存大小,不包括其属性引用对象所占的显存。如java.util.ArrayList对象的ShallowHeap包含8字节的对象头、8字节的对象字段属性elementData引用、4字节的size属性、4字节的modCount属性(从AbstractList承继及对象头占用显存大小),有的对象可能须要加对齐填充但ArrayList自身已对齐不需补充,注意不包含elementData具体数据占用的显存大小。
1.2.3RetainedSet
一个对象的RetainedSet,指的是该对象被GC回收后,所有能被回收的对象集合(如右图所示,G的RetainSet只有G并不包含H,缘由是即使H也被G引用,但因为H也被F引用,G被垃圾回收时未能释放H);另外,当该对象难以被GC回收,则其Retainedset也必然难以被GC回收。
1.2.4RetainedHeap
RetainedHeap是一个对象被GC回收后,可释放的显存大小,等于释放对象的RetainedHeap中所有对象的ShallowHeap的和(如右图所示,E的RetainHeap就是G与E的ShallowHeap总和,同理不包含H)。
1.2.5Dominatortree
倘若所有指向对象Y的路径都经过对象X,则X支配(dominate)Y(如右图中,C、D均支配F,但G并不支配H)。Dominatortree是按照对象引用及支配关系生成的整体树形图,支配树清晰描述了对象间的依赖关系,右图左的Dominatortree如右图右下方支配树示意图所示。支配关系还有如下关系:
1.2.6OQL
OQL是类似于SQL的MAT专用统一查询语言,可以按照复杂的查询条件对dump文件中的类或则对象等数据进行查询筛选。
1.2.7references
outgoingreferences、incomingreferences可以直击对象间依赖关系,MAT也提供了链式快速操作。
2.MAT功能概述及对比2.1MAT功能概述
注:MAT的产品能力十分丰富,本文简略总结产品特点帮你们了解概貌,在下一篇文章《JVM显存剖析实战进阶篇——核心功能及应用场景》中,会详尽展开介绍各项核心功能的场景、案例、最佳实践等。
MAT的工作原理是对dump文件构建多种索引,并基于索引来实现[1]显存分布、[2]对象间依赖(如实体对象引用关系、线程引用关系、ClassLoader引用关系等)、[3]对象状态(显存占用量、字段属性值等)、[4]条件检索(OQL、正则匹配查询等)这四大核心功能,并通过可视化诠释辅助Developer精细化了解JVM堆显存概貌。
2.1.1显存分布2.1.2对象间依赖2.1.3对象状态2.1.4按条件检索对象
据悉,为了易于记忆与回顾,整理了如下脑图:
2.2常见显存剖析工具对比
右图中Y表示支持,N表示不支持,时间截止发稿前。
产品功能MATJProfilerVisualVMjhatjmaphprof
对象关联剖析、深浅堆、GCROOT、内存泄露检查、线程剖析、提供自定义程序扩充扩充
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.QuickStart及使用方法3.1QuickStart
注:QuickStart文章较多,本文侧重介绍安装流程及使用方法。
1、安装MAT:戳【下载链接】;也可直接集成到EclipseIDE中(路径:Eclipse→Help→EclipseMarketplace→搜“MAT”)。
2、调节MAT堆显存大小:MAT剖析时也作为Java进程运行,假如有足够的显存linux 进程 内存溢出 检测工具,建议起码分配dump文件大小*1.2倍的显存给MAT,这样剖析速率会比较快。方法是更改MemoryAnalyer.ini文件,调整Xmx参数(Windows可用搜索利器everything软件查找并更改、MACOS通常在/Applications/mat.app/Contents/Eclipse/MemoryAnalyzer.ini,如找不到可用Alfred软件查询更改)。
3、获取堆快照dump文件(堆轮询须要先执行FullGC,线上服务使用时请注意影响),通常用三种形式:
4、分析dump文件:路径是File→OpenHeapDump,之后MAT会构建索引并剖析,dump文件较大时历时会很长。剖析后dump文件所在目录会有后缀为index的索引文件,也会有包含HTML格式的后缀为zip的文件。
5、完成索引估算后,MAT呈现概要视图(Overview),包含三个部份:
6、如果代码比较复杂,须要继续使用MAT各类工具并结合业务代码进一步剖析显存异常的缘由。最常用的几项如下(具体案例、场景、使用方法在《JVM显存剖析工具MAT的深度讲解与实践——进阶篇》详细介绍):
3.2使用方法及注意事项
1、注意对运行进程的性能影响:Heapdump时会先进行FullGC,另外为保证对象数据视图一致,须要在安全点StopTheWorld暂停响应,线上服务进行勿必注意性能影响。可以采取以下方法降低影响:
2、Dump文件及完善的索引文件可能较大,假如开发机配置不足未能剖析,可在服务器先执行剖析后,基于剖析后的索引文件直接查看结果linux社区,另外也须要注意c盘占用问题:
3、其他
总结展望:至此本文讲解了MAT实践必备的中级内容linux 进程 内存溢出 检测工具,在下一篇《JVM显存剖析工具MAT的深度讲解与实践——进阶篇》会展开并详尽介绍MAT丰富的核心功能,每位功能点讲解就会从具体场景聊起,帮助你们在实战场景下加深感受实现进阶。
参考内容