使用MAT分析线上问题实战

news2024/11/24 12:47:45

概述

MAT,下载地址,Eclipse Memory Analysis Tools,一个分析Java堆数据的专业工具,可以计算出内存中对象的实例数量、占用空间大小、引用关系等,可得知哪些线程阻止垃圾收集器的回收工作,从而定位内存泄漏的原因。

什么时候会用到MAT?

  1. OutOfMemoryError时,触发Full GC,但空间却回收不了,引发内存泄露
  2. Java服务器系统异常,如load飙高,io异常,或线程死锁等,都可能通过分析堆中的内存对象来定位原因

分析堆转储文件需要消耗很多的堆空间,为保证分析的效率和性能,建议给MAT分配尽可能多的内存资源。两种方式:

  1. 修改启动参数MemoryAnalyzer.exe -vmargs -Xmx4g
  2. 编辑文件MemoryAnalyzer.ini添加-vmargs – Xmx4g

生成堆转储文件

简单来说使用jmap -dump命令可以生成堆转储文件。首先需要执行进程ID,即PID。通过topjps命令拿到Java进程pid

具体执行命令:jmap -dump:format=b,file=heap.hprof <pid>

如果执行命令报错:

Unable to open socket file: target process not responding or HotSpot VM not loaded.The -F option can be used when the target process is not responding

则执行命令:jmap -F -dump:format=b,file=heap.hprof <pid>
命令执行时,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,且执行过程中为保证dump的信息是可靠的,会暂停应用。

可通过-d64来解决:jmap -F -J -d64 -dump:format=b,file=dump.bin PID

一般dump下来的文件有几个G,如果dump下来的文件只有一两百M,说明jmap命令执行有问题,需多执行几次才能得出正常结果,这个时候可以选用gcore把整个内存dump出来,然后再使用jmap把core dump转换成heap dump。

做法就是用gcore 1234命令来生成c版的core文件,再用命令jmap -dump:format=b,file=heap.hprof /bin/java core.1234.

概念

Shallow Size

Shallow size就是对象本身占用内存的大小,不包含其引用的对象。常规对象(非数组)的 Shallow size 由其成员变量的数量和类型决定。数组的 shallow size 由数组元素的类型(对象类型、基本类型)和数组长度决定。

在 32 位系统上,对象头占用 8 字节。int 占用 4 字节,不管成员变量(对象或数组)是否引用其他对象(实例)或赋值为 null 它始终占用 4 字节。对于 String 对象实例来说,它有三个 int 成员(34=12 字节)、一个 char[] 成员(14=4 字节)以及一个对象头(8 字节),总共 34 +14+8=24 字节。

注意JDK 版本区别:

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

    /** The offset is the first index of the storage that is used. */
    private final int offset;

    /** The count is the number of characters in the String. */
    private final int count;

    /** Cache the hash code for the string */
    private int hash; // Default to 0
}

Retained Size

对象的 Retained Size = 对象本身的 Shallow Size + 对象能直接或间接访问到对象的 Shallow Size。即,Retained Size 就是该对象被 Gc 之后所能回收内存的总和。即,该对象到其他对象有引用关系并且该引用对象到 Gc Root 节点是不可达的。总之,Retained size 是一个整体度量,能反映内存结构和对象图的依赖关系,还可以找到根节点。在进行GC时,如果实例对象到 Gc Root 是不可达的,那么该对象会被回收。

Heap Size

堆的大小,当资源增加,当前堆的空间不够时,系统会增加堆的大小,若超过上限(如 64M,阈值视平台而定)则会被杀掉 。

Allocated

堆中已分配的大小,即 App 应用实际占用的内存大小,资源回收后,此项数据会变小。

建议:若单一操作反复进行,堆大小一直增加,则有内存泄露的隐患,可采用 MAT 进一步查看。

问题

Java heap space

打开dump1.phrof文件失败,报错信息如下:
在这里插入图片描述
解决方案:
编辑MemoryAnalyzer.ini文件,修改-Xmx1024m-Xmx2048m,当然也可以修改为其他数值,大于1024即可,然后得是2的n次方。参考链接见文末。

The HPROF parser encountered a violation

打开dump1.phrof文件失败,报错信息如下:
在这里插入图片描述
详细的报错日志:

The HPROF parser encountered a violation of the HPROF specification that it could not safely handle. This could be due to file truncation or a bug in the JVM. Please consider filing a bug at eclipse.org. To continue parsing the dump anyway, you can use -DhprofStrictnessWarning=true or set the strictness mode under Preferences > HPROF Parser > Parser Strictness. See the inner exception for details.
The HPROF parser encountered a violation of the HPROF specification that it could not safely handle. This could be due to file truncation or a bug in the JVM. Please consider filing a bug at eclipse.org. To continue parsing the dump anyway, you can use -DhprofStrictnessWarning=true or set the strictness mode under Preferences > HPROF Parser > Parser Strictness. See the inner exception for details.
(Possibly) Invalid HPROF file: Expected to read another 3,458,508,632 bytes, but only 125,883,023 bytes are available for heap dump record 0x21 at 0x8114f34a.
(Possibly) Invalid HPROF file: Expected to read another 3,458,508,632 bytes, but only 125,883,023 bytes are available for heap dump record 0x21 at 0x8114f34a.

解决方案:
考虑到上面的问题1,没有Google搜索,直接在配置文件MemoryAnalyzer.ini里面增加一行配置:-DhprofStrictnessWarning=true,重启MAT,重新打开dump1.phrof文件,解析成功。

实战

打开一个.hprof文件,主要有三个模块,左侧顶部的Inspector,左侧底部如下信息:
在这里插入图片描述
右侧主面板:
在这里插入图片描述

  • 工具栏及Overview
  • Details:概要信息,如空间大小、类的数量、对象实例数量、类加载器等
  • Biggest Objects by Retained Size:以饼状图给出大对象,鼠标移动到饼图某个区域上方,在左侧会看到对象的详细信息
  • Atcion提供多种分析维度:
    • Histogram:按类列出内存中的对象,对象的个数以及大小
    • Dominator Tree:支配树,分析对象的引用关系
    • Top Consumers:
    • Duplicate Classes:
  • Reports:
    • Leak Suspects:分析内存泄漏
    • Top Components:
  • Step By Step:

概念:
Shallow Heap:类对象本身占用内存大小,不包含其引用的对象内存
Retained Heap:对象自己占用内存 + 关联引用对象占用大小。相对于shallow heap,RetainedHeap可以更精确的反映一个对象实际占用的大小(因为如果该对象释放,retained heap都可以被释放)。
Retained Set:指这个对象本身和他持有引用的对象以及这些引用对象的Retained Set所占内存大小的总和

Histogram

该视图以Class类的维度展示每个Class类的实例存在的个数、占用的[Shallow内存]和[Retained内存]大小,可分别降序显示(升序没有意义),尤其是对Retained内存降序展示,

还可以按照对象或Class引用和被引用展示:List objects or Show objects by class:

  • with incoming references:列出哪些类引入该类
  • with outgoing references:出该类引用哪些类

多数情况下,在Histogram视图看到实例对象数量比较多的类都是一些基础类型,如char[](因为其构成String)、String、byte[],所以仅从这些是无法判断出具体导致内存泄露的类或者方法的,可以使用 List objects 或 Merge Shortest Paths to GC roots–>exclude all phantom/weak/soft etc.reference(排除所有虚弱软引用)–>查看剩余未被回收的强引用对象占用原因 等功能继续钻取数据。如果Histogram视图展示的数量多的实例对象不是基础类型,是有嫌疑的某个类,如项目代码中的bean类型,那么就要重点关注了。

打开方式:

  1. Overview > Actions > The Histogram
  2. 工具栏 > Histogram

Dominator Tree

支配树,分析对象的引用关系。 对象内存占用&占比

dominate_tree -> 对象调用堆栈树-查找内存占用最高对象(Retained Heap倒叙排序) -> Paths to GC Roots -> exclude all phantom/weak/soft etc.reference(排除所有虚弱软引用) -查找GC Root线程-> 定位未释放内存代码段

Actions > dominator_tree (查看堆中内存占用最高的对象的线程调用堆栈) -> 对象调用堆栈树-查找内存占用最高对象(Retained Heap倒叙排序) -> Paths to GC Roots -> exclude all phantom/weak/soft etc.reference (排除所有虚弱软引用) -查找GC Root线程 -> 查找未释放的内存占用最高的代码逻辑段(很可能是产生内存溢出代码)

Leak Suspects

打开方式:

  1. Overview > Reports > Leak Suspects
  2. 工具栏 > Run Expect System Test > Leak Suspects

自动分析内存泄露可疑点,给出一份可疑分析报告。MAT将报告内容压缩打包到一个zip文件,并放在原始堆转储文件的目录下,一般命名为xxx_Leak_Suspects.zip,xxx是dump文件名,zip包文件很小,方便分发共享,请教他人协助排查内存泄露问题;报告是HTML文件。

以饼状图给出可疑的内存泄漏点,Details明细

OQL

Object Query Language,类似于SQL,能够用来查询当前内存中满足指定条件的所有对象。

Thread Overview

可看到:线程对象/线程栈信息、线程名、Shallow Heap、Retained Heap、类加载器、是否Daemon线程等信息。结合左侧的对象属性区域,可以更方便的看清线程中对象的具体情况。

打开方式:工具栏

Query Browser

对比dump堆栈文件

复杂的内存泄漏情况,需要通过对比hpof文件来进行分析。
生成第一个hpof文件,进行一段时间操作,再生成第二个hpof文件。用MAT打开这两个hpof文件。
将第一个和第二个hpof文件的Dominator Tree或者Histogram添加到Compare Basket中,之后选中2个文件对比即可
2个dump文件对比寻找波动差异(关注差异波动大的对象)

参考

  • MAT open heap dump file failed with java heap space
  • Eclipse Memory Analyzer Tool Help
  • 使用MAT分析线上故障(一) - 视图&功能篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/51026.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何低成本减少企业知识流失?天翎知识文档系统+群晖NAS值得一试

编者按&#xff1a;知识管理可以减少企业知识流失&#xff0c;有效提高企业员工工作水平&#xff0c;增强企业综合竞争力。如何小成本做好企业知识管理呢&#xff1f;天翎知识文档系统群晖NAS值得一试。 关键词&#xff1a;标签分类&#xff0c;权限管理&#xff0c;在线预览&…

Git学习

Git是什么 Github作为最大的代码托管平台&#xff0c;是基于Git开发的 Git是最优秀的版本控制工具 iCode是基于Git的代码托管平台 版本控制&#xff1a;是对软件开发过程中各种程序代码&#xff0c;配置文件&#xff0c;说明文档等。 版本控制系统&#xff1a;集中式、分布式 …

在Mac中管理多版本 java——安装和使用 jenv

jenv 的 github 地址:https://github.com/jenv/jenv 安装 $ brew install jenv安装成功后需要进行一下简单的配置,让它可以起作用 使用Bash的情况$ echo export PATH="$HOME/.jenv/bin:$PATH" >> ~/.bash_profile $ echo eval "$(jenv init -)" &…

MAC 搭建vue开发环境,配置环境变量

1.官网下载nodejs安装包 http://nodejs.p2hp.com/ 下载完成后安装&#xff0c;一直点击下一步即可 2.自定以配置全局模块路径和缓存路径 先自己找一个路径创建两个文件夹&#xff0c;node_cache 和 node_global 打开终端&#xff0c;执行一下俩条命令,注意引号中的路径要换…

图纸识别自动生成BOM清单的方法

01 方案应用领域及行业 高端装备制造业行业、离散型制造业、电气机械和器材制造业等。 02 方案应用场景 某特变电工公司是国内输变电行业的核心骨干企业&#xff0c;每年生产产能巨大&#xff0c;拥有海量的技术图纸&#xff0c;因此技术人员人工拆解设计图纸的工作难度系数大…

【优化调度】基于改进遗传算法的公交车调度排班优化的研究与实现(Matlab代码实现)

目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 1 概述 本文对当前公交企业调度系统进行了分析&#xff0c;建立了公交排班的数学模型。本文基于数据挖掘分析的结果上&#xff0c;使用截面客流量数据对模型进行约束&#xff0c;得出了公交客流出行的空间分布规律。再以…

软件测试1

这里写自定义目录标题软件测试的定义1、软件测试的目的2、软件测试的要求3、测试与开发的模型3.1 测试的工作流程3.2 开发模型3.2.1 瀑布模型3.2.2 增量模型3.2.3 快速模型3.2.4 其他模型3.3 测试模型4、测试与开发的关系5、软件测试分类软件测试的定义 找Bug,发现缺陷。使用人…

全球科学家给孩子的stem课【001-046】mp3合集

全球科学家给孩子的stem课【001-046】mp3合集&#xff0c;适合给孩子们启蒙教育使用。 一只蚂蚁走丢后的8种可能结局.mp3 下雨天清爽的味道&#xff0c;来自尸体和臭气.mp3 为什么光的三原色是红绿蓝&#xff0c;绘画的三原色又成了红黄蓝&#xff1f;.mp3 为什么剖腹产的孩子…

患有癌症的心力衰竭患者LVAD植入前景可期

相关调查显示&#xff0c;患有终末期心力衰竭的癌症患者&#xff08;有癌症史&#xff09;正在增加&#xff0c;但其进行心脏移植的可能性不大&#xff0c;而左心室辅助装置&#xff08;LVAD&#xff09;是一种可选择的替代策略。近日&#xff0c;发表于Circulation: Heart Fai…

[附源码]SSM计算机毕业设计疫情期间回乡人员管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Kotlin高仿微信-第27篇-朋友圈-相册选择图片或小视频

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

ContentProvider启动流程分析

文章目录1.ActivityThread.handleBindApplication()2.ActivityThread.installContentProviders()3.ActivityThread.installProvider()4.AppComponentFactory.instantiateProvider()5.ActivityManagerService.publishContentProviders()6.ContentProviderHelper.publishContentP…

基于Web的美食分享平台的设计与实现——HTML+CSS+JavaScript水果介绍网页设计(橙子之家)

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

[附源码]计算机毕业设计springboot汽车租赁管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

项目的坎坷一生

一、从产品到项目 项目的定义&#xff1a;只会进行一次&#xff0c;包含多项互相关联的任务&#xff0c;并且有绩效、时间、成本和范围限制的一项工作。 产品是解决某个问题的东西&#xff0c;项目是一个过程。 1、做产品VS做项目 ①从生命周期角度区别 做产品的生命周期相…

[附源码]JAVA毕业设计的问卷调查系统设计与实现(系统+LW)

[附源码]JAVA毕业设计的问卷调查系统设计与实现&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 …

dreamweaver网页设计作业制作 学生个人网页猫眼电影 WEB静态网页作业模板 大学生个人主页博客网页代码 dw个人网页作业成品

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

高校房产管理系统应具备哪些基本功能?

数图互通经过多年高校房产管理实施认为高校房产管理系统应用层面应具备的基本功能如下&#xff1a; 1、框架平台&#xff08;含系统管理、系统接口&#xff09; 框架平台包含系统权限管理、用户管理、角色管理、菜单管理、VPA数据权限管理、数据字典管理、系统日志管理、数据…

jsp汽车销售管理软件Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp汽车销售管理软件 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使用…

证券企业基于华为全闪存存储实践经验分享

【导读】本文结合华为存储相关最佳实践和证券公司长期使用多厂商的全闪存存储的实践经验进行总结分享,内容包括:剖析存储发展过程中遇到难题、使用华为中端全闪存存储架构分析、项目中存储规划说明、全闪存存储实践经验总结等。希望能对券商同行存储架构选型实践等提供参考借…