JVM内存分析之MAT工具,一篇文章带你入门!
MAT是一个功能丰富的Java Heap分析工具,它可以帮助我们快速查找内存泄漏,减少内存消耗。
通过这一内存分析工具,我们可以从众多对象中进行分析,快速计算出在内存中的对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并支持通过报表直观地查看可能造成这种结果的对象。本期文章带你解锁MAT,从基础概念到案例解析全都有,一起看看吧~
基础概念
Heap Dump
Heap Dump(堆转储)是Java虚拟机(JVM)在某一时刻内存使用情况的快照。Heap Dump 文件通常用来进行内存分析和故障排查,帮助开发者和运维人员诊断内存泄漏、内存溢出(OutOfMemoryError)等问题。它包含了以下几个关键信息:
1. 所有的对象信息,包括对象实例、成员变量、存储于栈中的基本类型值,以及存储于堆的其他对象的应用值。
2. 所有“类”的信息,包括classloader、类名称、父类、静态变量等。
3. GC Root到所有的这些对象的应用路径。
GC Root代表通过可达性分析来判定 JVM 对象是否存活的起始集合。JVM 采用追踪式垃圾回收(Tracing GC)模式,从所有GC Roots出发,通过引用关系可以关联的对象就是存活的(所以不可回收),其余的不可达的对象可以回收(Unreachable object:如果无法从 GC Root找到一条引用路径能到达某对象,则该对象为Unreachable object)。GC Root一般是未执行完的线程自身,或运行线程的调用栈上的对象(如局部变量、方法参数)、System class loader 加载的类、native code 保留的活动对象等。
4. 线程信息,包括线程的调用栈及此线程的线程局部变量(TLS)。
Shallow Heap
浅堆是指一个对象所消耗的内存,在32位系统中,一个对象应用会占据4个字节,一个int类型会占据4个字节,long型变量会占据8个字节,每个对象需要占用8个字节。根据堆快照格式不同,对象的大小可能会向8字节进行对齐。
Retained Heap
深堆是指对象集中所有的对象的浅堆大小之和。
保留集:对象A的保留集指当对象A被垃圾回收后,可以被释放的所有的对象集合(包括对象A本身),即对象A的保留集可以被认为是只能通过对象A被直接或间接访问到的所有对象的集合。通俗地说,就是指仅被对象A所持有的对象的集合。
浅堆指对象本身占用的内存,不包括其内部应用对象大小。一个对象的深堆指只能通过该对象访问到的所有对象的浅堆之和(直接或者间接),即对象被回收后,可释放的真实空间。
内存泄漏
申请了内存用完不释放,比如一共有8G的内存,分配了6G的内存一直不回收,那么可以用的内存只有2G,仿佛泄漏掉了一部分。
内存溢出
申请内存时,没有足够的内存可以使用。
MAT功能概述
核心功能介绍:
Histogram:展示了各类的实例数目以及这些实例的shallow heap或Retainedheap的总和。
Dominator tree:按对象的 Retain Heap 排序,也支持按多个维度聚类统计,最常用的功能之一。
Leak Suspects:自动检测堆dump文件,查看哪些可能泄漏的疑点,哪些对象还使用存活,为什么没有被垃圾回收。
Thread overview:展现转储 dump 文件时线程栈帧等详细状态,也提供各线程的Retain Heap等关联内存信息。
OQL:提供一种类似于SQL的对象(类)级别统一结构化查询语言。
例如:查找 size=0 且未使用过的 ArrayList:select * from java.util.ArrayList where size=0 and modCount=0;查找所有的String的length属性的:select s.length from instanceof Strings。
其中红色框内为最常用的功能,熟练掌握,可以分析处理80%Dump内存问题。
分析案例
获取dump文件
方法一:通过jamp生成"jmap -dump,format=b,file=heap.hprof 3514",可以生成任意一个java进程的dump。
方法二:通过JVM参数生成"-XX:+HeapDumpOnOutOfMemoryError"或"-XX:+HeapDumpBeforeFullGC"在FullGC之前生成堆dump。
加载dump文件
1. Leak Suspects Report(内存泄漏疑点报告-常用)
用于自动检测堆dump文件、查看可能泄漏的疑点、哪些对象还使用存活、为什么没有被垃圾回收。
2. Component Report(组件报告)
用于分析一些列对象集合,包括重复字符串、空集合、弱引用、终结器等。
3. Re-open previously run reports(打开一个已存在的dump报告)
可疑对象分析
直方图分析
1. 排除“虚引用/弱引用/软引用”等引用链,因为被“虚引用/弱引用/软引用”的对象可以被 GC回收,聚焦“Strong引用链”。
2. traceId:eb88a267345db514与之前Thread stack看到的一致。
线程分析
1. 查看当前对象被外部应用情况。
2. 疑似二开代码导致。
上诉内容就是MAT的一些基础分析手段,通过一些常用工具菜单就能协助技术人员快速地定位OOM故障。
划重点
MAT是一个使用便捷、功能丰富的Java heap分析工具,能够协助技术人员快速诊断和分析内存问题。
MAT核心功能包括:Histogram、Dominator tree、Leak Suspects、Thread overview和OQL查询语言。
#往期推荐
更多精彩内容,“码”上了解!↓
JVM内存分析之MAT工具,一篇文章带你入门!
本文2024-09-23 01:12:23发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-144451.html
- 鼎捷EAI整合規範文件V3.1.07 (集團).pdf
- 鼎捷OpenAPI應用場景說明_基礎資料.pdf
- 鼎捷OpenAPI應用場景說明_財務管理.pdf
- 鼎捷T100 API設計器使用手冊T100 APIDesigner(V1.0).docx
- 鼎新e-GoB2雲端ERP B2 線上課程E6-2應付票據整批郵寄 領取.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程A4使用者建立權限設定.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程C3會計開帳與會計傳票.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程E6-1應付票據.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程A5-1進銷存參數設定(初階篇).pdf
- 鼎新e-GoB2雲端ERP B2 線上課程D2帳款開帳與票據開帳.pdf