JVM内存分析之MAT工具,一篇文章带你入门!

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

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查询语言。




#往期推荐


Fiddler抓包教程,教你怎样抓得好抓得快

教你构建一个高性能、易伸缩的Redis集群

搞懂主从复制原理及搭建过程,只需这篇文章!

学会pgbackrest备份,再也不怕删库!


更多精彩内容,“码”上了解!↓  

上传图片

JVM内存分析之MAT工具,一篇文章带你入门!

MAT是一个功能丰富的Java Heap分析工具,它可以帮助我们快速查找内存泄漏,减少内存消耗。通过这一内存分析工具,我们可以从众多对象中进...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息