【开发篇】四、MAT堆内存分析(Memory Analyzer Tool)

这篇具有很好参考价值的文章主要介绍了【开发篇】四、MAT堆内存分析(Memory Analyzer Tool)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、使用

内存溢出后,分析泄露的思路是:

  • 在OOM前,将整个堆内存保存成一个hprof文件
  • MAT打开hprof文件,MAT自行分析可疑对象

添加JVM参数:

-XX:+HeapDumpOnOutOfMemoryError  //发生OutOfMemoryError错误时,自动生成hprof内存快照文件
-XX:HeapDumpPath=D:\myTmp\heap.hprof  //指定hprof文件的输出路径

模拟个OOM:
【开发篇】四、MAT堆内存分析(Memory Analyzer Tool),JVM,mat,heap,java

2、报错

在MAT里打开hprof文件:

【开发篇】四、MAT堆内存分析(Memory Analyzer Tool),JVM,mat,heap,java

报错:

【开发篇】四、MAT堆内存分析(Memory Analyzer Tool),JVM,mat,heap,java

很清晰了,下载JDK17或者换一个低版本的MAT(适配你配置的JDK版本的MAT),我当前是JDK11,下载地址【点击】

【开发篇】四、MAT堆内存分析(Memory Analyzer Tool),JVM,mat,heap,java

这里同时配置两个版本的JDK,JDK11我还要用以后:

【开发篇】四、MAT堆内存分析(Memory Analyzer Tool),JVM,mat,heap,java

classpath不变:

【开发篇】四、MAT堆内存分析(Memory Analyzer Tool),JVM,mat,heap,java

JDK版本切到17后,改下mat目录下的MemoryAnalyzer.ini文件,文件内容后面追加以下内容(注意替换目录为自己JDK17的目录,且到bin一层):

-vm
D:\jdk\jdk-17\bin   

打开MAT:

【开发篇】四、MAT堆内存分析(Memory Analyzer Tool),JVM,mat,heap,java

分析内存泄漏:

【开发篇】四、MAT堆内存分析(Memory Analyzer Tool),JVM,mat,heap,java

大致概览,点击可查看这块是啥:

【开发篇】四、MAT堆内存分析(Memory Analyzer Tool),JVM,mat,heap,java

点击Detail,查看怀疑对象线程的栈信息:

【开发篇】四、MAT堆内存分析(Memory Analyzer Tool),JVM,mat,heap,java

重点看自己代码的栈信息,然后排查这一行写的是否有问题:

【开发篇】四、MAT堆内存分析(Memory Analyzer Tool),JVM,mat,heap,java

3、MAT支配树

在对象引用图中,所有指向对象B的路径都经过对象A,则认为对象A支配对象B。

【开发篇】四、MAT堆内存分析(Memory Analyzer Tool),JVM,mat,heap,java

再看对象D,引用图中想指向对象D,从近处看,可以是对象B,也可以对象C,所以对象B、C对D没有支配关系,往远看,对象A则可以支配对象D。同理,E被C支配,而C被A支配。演化出支配树后:

  • 支配树上对象本身所占空间称浅堆
  • 被对象A支配的所有对象,合起来叫深堆,也叫保留集

A的深堆,就是B、C、D、F、E这些对象加起来的大小,深堆浅堆的概念,表示了一个对象如果可以被回收,能释放多大的内存空间。

//练习

引用链到支配树:
【开发篇】四、MAT堆内存分析(Memory Analyzer Tool),JVM,mat,heap,java

4、MAT内存泄漏的检测原理

用MAT验证下上面支配树的正确性,改JVM参数,这次不再等内存溢出时才生成内存快照,而是在Full GC后生成:

//添加JVM参数
-XX:+HeapDumpBeforeFullGC

运行上面练习的代码,并打开生成的快照文件。(卡了一小时没生成,不知道是不是JDK版本太高了,跳过了,反正这个参数也就这里用一下,生产环境狗都不用,卡的我莫名来气,贴个其他示意图)点击选择支配树,找到main线程节点:

【开发篇】四、MAT堆内存分析(Memory Analyzer Tool),JVM,mat,heap,java

这里可以看到每个浅堆的深堆大小。

MAT就是根据支配树,从叶子节点向根节点遍历,如果发现深堆的大小超过整个堆内存的一定比例阈值,就会将其标记成内存泄漏的嫌疑对象、

5、导出运行中系统的内存快照

生产环境观察到堆内存在一直涨,想分析,肯定不能为了导一个快照模拟个OOM,这里导出运行中的快照:

方式一:过JDK自带的jmap命令导出

jmap -dump:live,format=b,file=文件路径和文件名 进程ID

参数含义:

//format=b,即以二进制的形式保存
//-dump:live,只导出标记为存活的对象
//进程ID,自己ps -ef找

方式二:阿尔萨斯的的heapdump

heapdump --live 文件路径和文件名

上面这个指令可以在tunnel服务端页面执行:

【开发篇】四、MAT堆内存分析(Memory Analyzer Tool),JVM,mat,heap,java

也可以直接启动阿尔萨斯jar包后选择PID,再去执行。MAT打开快照,点击查看对象直方图,里面也显示了一个对象的浅堆和深堆大小,点击表头可排序,这种浅堆和深堆在一个数量级的,一般没问题。

【开发篇】四、MAT堆内存分析(Memory Analyzer Tool),JVM,mat,heap,java
【开发篇】四、MAT堆内存分析(Memory Analyzer Tool),JVM,mat,heap,java

6、补充

MAT在打开当前的堆内存快照时,需要把快照下的堆内存里的所有对象读入到内存中,这对安装MAT的机器配置有要求,一般的开发桌面打不开这么大的快照文件,而且下载一个几十G的hprof文件,下行带宽小也头疼。这时可直接下载系统所在服务器对应操作系统对应的MAT:https://eclipse.dev/mat/downloads.php

./ParseHeapDump.sh 快照文件路径 org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components
//三个参数的含义:
//org.eclipse.mat.api:suspects 生成内存泄漏检测报告
//org.eclipse.mat.api:overview 生成总览图
//org.eclipse.mat.api:top_components 生成组件图

执行脚本,启动MAT,分析堆内存,后生成报告,只需下载包告后解压,查看生成的这几个html报告查看即可。

【开发篇】四、MAT堆内存分析(Memory Analyzer Tool),JVM,mat,heap,java

最后,MAT默认只使用了1G的堆内存,分析超过1G的快照文件,可调大MAT目录下的MemoryAnalyzer.ini这个值:

【开发篇】四、MAT堆内存分析(Memory Analyzer Tool),JVM,mat,heap,java文章来源地址https://www.toymoban.com/news/detail-804931.html

到了这里,关于【开发篇】四、MAT堆内存分析(Memory Analyzer Tool)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 内存溢出(二)使用 MAT 分析 .hprof 内存映像文件

    .hprof 文件: 是 java 项目的 Heap Dump 文件,也叫内存映像文件、内存快照文件,可以存放一个 java 进程在某个时间点的内存快照。生成 Heap Dump 文件的方式有两种:一是使用 jmap 命令手动导出,二是启动脚本中添加 -XX:+HeapDumpOnOutOfMemoryError 参数自动导出。本文中只涉及第二种。

    2023年04月08日
    浏览(69)
  • mac pro m1:安装dump文件内存分析工具——MAT

    本文主要针对mac m1下安装Jprofiler进行讲解,安装核心步骤同样适用于其他系统 如果使用的是eclipse可以在插件中直接安装MAT,因为我使用的是idea开发,所以选择独立安装MAT工具 1、下载地址:https://www.eclipse.org/mat/downloads.php 选择你需要的版本,这里我选择的mac arm架构版,注意

    2024年02月06日
    浏览(40)
  • android 如何分析应用的内存(十七)——使用MAT查看Android堆

    前一篇文章,介绍了使用Android profiler中的memory profiler来查看Android的堆情况。 如Android 堆中有哪些对象,这些对象的引用情况是什么样子的。 可是我们依然面临一个比较严峻的挑战:不管是app开发者,还是内存分析者而言,堆中的对象,非常之多,不仅有Android 原生的类,还

    2024年02月13日
    浏览(72)
  • JVM-性能优化工具 MAT

    MAT( Memory Analyzer Tool )工具是一款功能强大的 ]ava 堆内存分析器。可以用于查找内存泄漏以及查看内存消耗情况。MAT是基于 Eclipse 开发的,不仅可以单独使用,还可以作为插件的形式嵌入在 Eclipse 中使用。是一款免费的性能分析工具,使用起来非常方便。 https://www.eclipse.

    2024年02月11日
    浏览(39)
  • JVM实战(22)——jamp和MAT实战

    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖,挖的越深,基础越扎实! 阶段1、深入多线程 阶段2、深入多线程设计模式 阶段3、深入juc源码解析

    2024年01月19日
    浏览(35)
  • 【JVM】JVM堆内存(heap)详解

    JAVA堆内存管理是影响性能主要因素之一。 堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的。 先看下JAVA堆内存是如何划分的,如图: JVM内存划分为堆内存和非堆内存,堆内存分为年轻代(Young Generation)、老年代(Old Generatio

    2024年02月09日
    浏览(45)
  • 使用MAT分析OOM问题

    OOM和内存泄漏在我们的工作中,算是相对比较容易出现的问题,一旦出现了这个问题,我们就需要对堆进行分析。 一般情况下,我们生产应用都会设置这样的JVM参数,以便在出现OOM时,可以dump出堆内存文件,也就是保留案发现场,方便我们后续的研究。 至于分析堆内存的工

    2024年02月12日
    浏览(37)
  • FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory node编译时的内存溢出

    报错:FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory 原因:node编译时的内存溢出,因为打包文件过大,刚好超过内存的限制大小造成编译中断。 解决方法1: 解决方法2:(实践过可用) 使用 increase-memory-limit 插件,增加node服务器内存限制

    2024年02月03日
    浏览(39)
  • MATLAB /Simulink 快速开发STM32(使用st官方工具 STM32-MAT/TARGET),以及开发过程

    配置好环境以后就是开发: stm32cube配置芯片,打开matlab添加ioc文件,写处理逻辑,生成代码,下载到板子中去。 配置需要注意事项: STM32CUBEMAX6.5.0 + MABLAB2022B+keilV5.2 Matlab生成的代码CTRL+B 其中关键的配置有哪些,如图: untitledtest_stm32是matlab生成的代码

    2024年02月14日
    浏览(49)
  • Android 内存分析(java/native heap内存、虚拟内存、处理器内存 )

    1.jvm 堆内存(dalvik 堆内存) 不同手机中app进程的 jvm 堆内存是不同的,因厂商在出厂设备时会自定义设置其峰值。比如,在Android Studio 创建模拟器时,会设置 jvm heap 默认384m , 如下图所示: 当app 进程中java 层 new 对象(加起来总和)占用的堆内存达到jvm heap 峰值时,就会抛出OOM 。

    2024年02月14日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包