[转帖]JVM 使用mat分析Dump文件排查大对象解决系统full GC问题

jvm,使用,mat,分析,dump,文件,排查,对象,解决,系统,full,gc,问题 · 浏览次数 : 0

小编点评

**MAT工具的使用方法和适用场景** **引言** MAT(Memory Analyzer Tools)是一款强大的内存分析工具,可以帮助程序员快速定位内存泄漏问题。本文将介绍如何利用MAT进行Android内存泄漏分析。 **什么是Dump文件?** Dump文件是一种内存快照文件,可以用于查看进程或系统在某一个给定时间的内存状态。 **如何查看Dump文件?** 可以使用`ps -aux`命令在终端中查看进程的信息,其中包含`java进程号`。然后,可以使用管道符和grep命令从输出中获取Dump文件的名字。 **如何准备Dump文件?** 在使用`ps -aux`命令获取进程信息时,需要将参数带上。例如,要获取java进程的Dump文件,可以使用以下命令: ```bash ps -aux | grep javaorjps -lJMAP导出dump 文件 ``` **使用Mat进行内存分析** 1. 下载并安装Mat工具。 2. 启动Mat工具,选择“Load Dump”选项,选择dump文件。 3. 选择“Histogram”选项,分析内存使用情况。 4. 您可以使用其他功能,例如“Leak Suspects”、“Object”等。 **使用技巧** * 优化代码以减少内存使用。 * 使用类加载器或 package 分组进一步排查问题。 * 使用`Leak Suspects`功能分析引用链条上占用内存的对象。 * 使用`Histogram`功能快速定位内存泄漏问题。 **结论** 通过使用MAT工具,程序员可以快速定位内存泄漏问题并解决它们。此工具具有许多功能,可以帮助您深入分析内存使用情况。

正文

https://www.cnblogs.com/east7/p/16989436.html

 

摘要:介绍内存分析工具Mat查找大对象的使用方法,定位full GC根源,拉升系统吞吐量,避免内存泄漏。

引言

  线上服务器频繁发生full GC,直接拉低系统吞吐量,甚至OOM。今天我们来一起学习一下如何利用MAT(Memory Analyzer Tool)快速的定位Java程序的大对象和内存泄漏问题。本文实验环境为Mac下安装独立版的Eclipse Memory Analyzer Version 1.13.0。

  对于程序员来说码代码容易,保证代码的稳定性很难。有时候写完一个功能可能只需要一天时间,但是这个功能隐藏的bug导致的线上问题排查可能需要一周或者更长时间。因此,拥有良好的代码结构和编码规范是一个程序员应该长期坚持并为之奋斗的一个目标。但是,百密也难免一疏,没有百分之百没有问题的代码,在产品上线前,我们需要对自己的代码进行充分的自测,解决发现问题,保证产品的稳定性并减少对用户的困扰。今天,就给大家简单介绍一下如何使用MAT(Memory Analyzer Tools)进行Android内存泄漏分析,我只是抛砖引玉,希望大家能够灵活地将这个强大的工具使用起来。

  什么是Dump文件?Dump文件也称为内存转储文件或内存快照文件,是一个进程或者系统在某一个给定时间的内存快照。例如当进程崩溃或进程出现其它问题时,甚至在任何时候,我们都可以使用工具备份系统或进程的内存进行调试和分析。它包含模块信息、线程信息、堆栈调用信息、异常信息等。

查看java服务进程pid

  若想查看指定的进程,如java进程,可以通过管道符和grep命令进行查询,命令如下:

ps -aux | grep java
or
jps -l

JMAP导出dump 文件

  在使用mat进行内存分析前,需要准备好Heap dump文件,避免服务重启后无法复现问题。输出jvm的heap内容到指定文件,live子选项是可选的,假如指定live选项,那么只输出活的对象到文件:

jmap -dump:live,format=b,file=myFullGcDump.bin

  替换为上一节拿到的服务进程号即可,此命令将把dump信息导入到myFullGcDump.bin文件中,供下文分析使用。

  大家在使用上述命令时候一定要小心,如果服务器上的JVM heap过大,会造成应用“Stop the World”。建议使用参数的形式,在启动应用程序的时候就把参数带上,这样会在内存溢出的时候及时的保存线程dump文件。

  把服务器上的myFullGcDump.bin文件下载到本地之后,根据dump文件大小调整mat内存,打开mat初始化文件MemoryAnalyzer.ini,将启动内存调整至比dump大的适当大小,例如-Xmx8120m:

  现在开启我们的dump文件分析之路吧。

梳理mat功能

  先通过一张图来了解强大的Eclipse 插件mat的功能菜单:

  第一个菜单i用于概览全局信息,这是最常用的一个菜单。

mat分析大对象

  下面进入本文核心,分析前面下载的dump文件。通过下图中的Open a Heap Dump按钮加载需要分析的本地dump文件,历史浏览版文件会在按钮下方展示。

Getting Started

  在Getting Started Wizard页面勾选Leak Suspects Report,然后,单击Finish输出首份报告:

  这时可以大概看出内存中存在的问题,此处可以初步定位到内存异常的信息,但是具体问题定位还需继续进行分析。overview界面会以饼图的方式显示当前消耗内存最多的几类对象,可以使我们对当前内存消耗有一个直观的印象。但是,除非你的程序内存泄漏特别明显或者你正好在生成hprof文件之前复现了程序的内存泄漏场景,你才可能通过这个界面猜到程序出问题的地方。

Dominator tree

  开始 Dump 分析时,首先应使用 Dominator tree 了解各支配树起点对象所支配内存的大小,进而了解哪几个root对象是 GC 无法释放大内存的原因。

  Shallow Heap 和 Retained Heap分别表示对象自身不包含引用的大小和对象自身并包含引用的大小。默认的大小单位是 Bytes,可以在 Window - Preferences 菜单中设置单位,图中设置的是KB。

  针对非数组类型的对象,Shallow Heap的大小就是对象与它所有的成员变量大小的总和。当然这里面还会包括一些java语言特性的数据存储单元。针对数组类型的对象,Shallow Heap的大小是数组元素对象的大小总和。

  当个别对象支配树的 Retained Heap 很大且存在明显倾斜时,可以重点分析它们的对象支配关系,展开RingBuffer(老铁的代码可能是其他类)的子树进一步定位到问题根因,如下图可看出最终是业务类的 LogData 对象持有的 String字符串过大:

  把鼠标悬浮在截图中选中行上方时,会显示value的具体值,这是 full GC的根源。其实,刚看到RingBuffer时,我们并不确认它是被哪个业务对象引用的,故需要展开子树,查看具体是哪个业务对象。

Histogram

  功能介绍:以直方图的方式来显示当前内存使用情况可能更加适合较为复杂的内存泄漏分析,它默认直接罗列每个类实例的数量和累计内存占比,包括自身内存占用量(Shallow Heap)及支配对象的内存占用量(Retained Heap)。

  它支持按对象数量、Retained Heap、Shallow Heap(默认排序)等指标排序;支持按正则过滤;支持按 package、class loader、super class、class 聚类统计。使用入口:MAT 主界面 → Histogram

  在这里,我们同样可以发现 LogData 对象吃掉了很大内存,当然,还有另外两个对象:

  根据Objects进行排序后可见,业务类LogData存在131072个对象,消耗的内存也比较靠前,SdkSpan和SpanData存在同样的问题,因此这三个类必定存在问题。

使用场景:有些情况下, Dominator tree 无法展现出热点对象(如按 class 聚合也无明显热点对象,此时 Dominator tree 很难做关联分析判断哪类对象占比高),这时可以使用 Histogram 查看所有对象所属类的分布,快速定位占据 Retained Heap 大头的类。

使用技巧:Integer,String 和 Object[] 一般不直接导致内存问题。为更好的组织视图,可以通过 class loader 或 package 分组进一步排查问题。

Leak Suspects

功能介绍:具备自动检测内存泄漏功能,罗列可能存在内存泄漏的问题点。

使用入口:一般当存在明显的内存泄漏时,分析完Dump文件后就会展现,也可以如下图在 MAT 主页找到 Leak Suspects。

使用场景:需要查看引用链条上占用内存较多的可疑对象。这个功能可解决一些基础问题,但复杂的问题往往帮助有限。

举例分析

  下图中 Leak Suspects 视图展现了两个线程支配了绝大部分内存。

  下图是点击上图中 Keywords 中 "Details" ,获取实例到 GC Root 的最短路径、dominator 路径的细信息。

  同样可以发现使用了RingBuffer的业务类创建了很多线程。

小结

  至此本文基于线上full GC 实战案例讲解了 MAT 工具中常用功能的使用方法和适用场景,尤其是各种功能的组合使用,对快速把脉 JVM 内存问题大有裨益。当然,这里介绍的Mat工具使用方法只是冰山一角,有兴趣的老铁们可以继续深挖。

  那么大家对于这件事都是怎么看的呢?欢迎在文章下方留言讨论,三人行必有我师焉!小编会仔仔细细地看每条评论。

Reference


  读后有收获,小礼物走一走,请作者喝咖啡。
  Buy me a coffee. ☕Get red packets.
 
作者:楼兰胡杨
本文版权归作者和博客园共有,欢迎转载,但请注明原文链接,并保留此段声明,否则保留追究法律责任的权利。

与[转帖]JVM 使用mat分析Dump文件排查大对象解决系统full GC问题相似的内容:

[转帖]JVM 使用mat分析Dump文件排查大对象解决系统full GC问题

https://www.cnblogs.com/east7/p/16989436.html 摘要:介绍内存分析工具Mat查找大对象的使用方法,定位full GC根源,拉升系统吞吐量,避免内存泄漏。 引言 线上服务器频繁发生full GC,直接拉低系统吞吐量,甚至OOM。今天我们来一起学习一下如何利用

[转帖]JVM 使用mat分析Dump文件排查大对象解决系统full GC问题

https://www.cnblogs.com/east7/p/16989436.html 摘要:介绍内存分析工具Mat查找大对象的使用方法,定位full GC根源,拉升系统吞吐量,避免内存泄漏。 引言 线上服务器频繁发生full GC,直接拉低系统吞吐量,甚至OOM。今天我们来一起学习一下如何利用

[转帖]JVM 使用mat分析Dump文件排查大对象解决系统full GC问题

https://www.cnblogs.com/east7/p/16989436.html 摘要:介绍内存分析工具Mat查找大对象的使用方法,定位full GC根源,拉升系统吞吐量,避免内存泄漏。 引言 线上服务器频繁发生full GC,直接拉低系统吞吐量,甚至OOM。今天我们来一起学习一下如何利用

[转帖]使用MAT命令行工具生成堆dump分析文件

https://www.cnblogs.com/hellxz/p/use_mat_linux_command_line_generate_reports.html 写作目标 Java程序运行过程中,难免会出现 OOM,往往是在 JVM 启动参数中添加出现 OOM 时输出堆 dump(又名:堆转储、堆

[转帖]jvm学习三-MAT内存分析工具的使用

目录 1 模拟内存溢出程序 1.1 jvm配置 1.2 测试代码 2 MAT工具进行内存分析 2.1 大纲介绍 2.2 Histogram视图介绍 2.3 Leak Suspects视图介绍 2.4 Dominator Tree 1 模拟内存溢出程序 1.1 jvm配置 -XX:+PrintGCDe

[转帖]Eclipse-MAT的插件介绍使用

学习 尚硅谷 宋红康 JVM从入门到精通 的学习笔记 概述 MAT (Memory Analyzer Tool ) 工具是一款功能强大的Java堆内存分析器.可以用于查找内存泄露以及查看内存消耗情况. MAT是基于Eclipse开发的,不仅仅可以单独使用,还可以作为插件的形式内嵌在Eclipse中使

[转帖]谈 JVM 参数 GC 线程数 ParallelGCThreads 合理性设置

https://my.oschina.net/u/4090830/blog/7926038 1. ParallelGCThreads 参数含义 在讲这个参数之前,先谈谈 JVM 垃圾回收 (GC) 算法的两个优化标的:吞吐量和停顿时长。JVM 会使用特定的 GC 收集线程,当 GC 开始的时候,GC

[转帖]JVM-JDK8-G1垃圾收集器相关参数

https://www.cnblogs.com/happyflyingpig/p/15866285.html -XX:+UseG1GC 使用 G1 垃圾收集器 -XX:MaxGCPauseMillis -XX:MaxGCPauseMillis 设置期望达到的最大GC停顿时间指标(会尽力实现,但不保证

[转帖]JVM NativeMemoryTracking ;jcmd process_id VM.native_memory;Native memory tracking is not enabled

目录 一、Native Memory Tracking (NMT) 是Hotspot VM用来分析VM内部内存使用情况的一个功能。我们可以利用jcmd(jdk自带)这个工具来访问NMT的数据。 1.Native memory tracking is not enabled 打开NMT 二、查看原生内

[转帖]JVM监控及诊断工具-命令行

https://www.cnblogs.com/xiaojiesir/p/15622372.html 性能指标 停顿时间(响应时间) 提交请求和返回响应之间使用的时间,一般比较关注平均响应时间 常用操作的响应时间列表: 操作 响应时间 打开一个站点 几秒 数据库查询一条记录(有索引) 十几毫秒 机械