# Memory Analyzer (MAT) 在实际开发中的使用

Memory Analyzer (MAT) 在实际开发中的使用

文章目录

  • Memory Analyzer (MAT) 在实际开发中的使用
    • 概述
    • 注意点
    • 基本使用
      • 检查概述
      • 获取直方图
      • View the Dominator Tree
      • 到GC根的路径
    • 使用示例
      • 制作堆dump
        • HeapDumpOnOutOfMemoryError
        • Jmap 生成堆Dump
      • Mat打开堆快照
      • Histogram
      • Thread Overview
      • 执行内存泄露报告
      • 列出大对象
      • 查看对象占用树
    • 元素介绍
      • GcRoots
      • Shallow Heap
      • Retained set
      • with incoming references
      • with outgoing references
    • 参考文献

概述

  • MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题。该工具提供了两种使用方式,一种是插件版,可以安装到Eclipse使用,另一种是独立版,可以直接解压使用。

官网地址:Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation

注意点

  • 运行独立版本的内存分析器所需的最低 Java 版本是 Java 17,下载地址 https://pan.baidu.com/s/11IZ5m2D41r1S8Anu84H0ZQ?pwd=makq

在这里插入图片描述

  • 如果堆文件实际大小很大比如8G,但是用Mat打开后内存信息只有1G,那么可以通过下面的设置显示无法访问对象的详细信息,需要删除之前导入进来的重新导入
    在这里插入图片描述

基本使用

检查概述

  • 通过文件> 打开堆转储…打开堆转储…查看概述页。 如果您有可用的堆转储,请立即尝试打开堆转储。
    在这里插入图片描述

在右侧,您可以找到转储的大小和 类、对象和类装入器。
如果转储的总大小远小于 文件是可能的 堆转储包含许多垃圾 对象 在下一个垃圾桶时丢弃 收集。显示无法访问对象的步骤见注意点中描述的方法。

获取直方图

  • 从工具栏中 直方图图标选择直方图图标以列出每个类的实例数, 浅尺寸(ShallowHeap)和保留尺寸(Retained Heap

在这里插入图片描述

  • 浅堆是一个对象所消耗的内存,X的保留堆是X的保留集合中所有对象的浅大小之和,即X保留的存活内存。

    在这里插入图片描述

View the Dominator Tree

  • 支配树显示堆转储中最大的对象。树的下一层列出了那些对象,如果对父节点的所有传入引用被删除,这些对象将被垃圾收集。支配树是一种强大的工具,用于研究哪些对象使哪些其他对象保持存活。同样,树可以按照类加载器(例如组件)和包分组,以简化分析。

在这里插入图片描述

到GC根的路径

  • 从对象到GC根的(反向)引用链——所谓的GC根路径——解释了为什么对象不能被垃圾收集。该路径有助于解决Java中的经典内存泄漏:这些泄漏的存在是因为即使程序逻辑不再访问对象,对象仍然被引用。

在这里插入图片描述

使用示例

制作堆dump

HeapDumpOnOutOfMemoryError
  • 其实在很多时候我们是不知道何时会发生OOM,所以需要在发生OOM时自动生成dump文件。其实很简单,只需要在启动时加上如下参数即可。HeapDumpPath表示生成dump文件保存的目录。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\tmp
  • 当系统堆溢出的时候会自动生成快照文件,项目上一般都会配置这个参数
  • 内存溢出Idea 显示如下:
java.lang.OutOfMemoryError: GC overhead limit exceeded
Dumping heap to java_pid25396.hprof ...
Heap dump file created [1486916275 bytes in 5.168 secs]
Jmap 生成堆Dump
  • 首先要查找运行的Java程序的pid,然后使用jmap命令生成dump文件。file后面是保存的文件名称,1246则是java程序的PID
jmap -dump:format=b,file=user.dump 1246

Mat打开堆快照

  • 模拟堆栈溢出,如下图所示,从图中可以看出大对象占用 800M左右,RetainedSIze占用637.4M

在这里插入图片描述

Histogram

  • 列举类的实例信息,从这里面明显的可以看到,这个对象没有GCRoot而且占用比较大,很有可能是内存泄露的地方

在这里插入图片描述

Thread Overview

  • 线程分析概览,展示出了所有的线程,主线程,以及各个线程中的浅堆和深堆占用的大小,类加载器,是否守护线程等信息

在这里插入图片描述

执行内存泄露报告

  • 点击Leak Suspects 查看存在内存泄露的地方
    在这里插入图片描述

列出大对象

  • 从下面的这个图可以判断出程序中存在死循环

在这里插入图片描述

查看对象占用树

  • 在此视图中列出了每个对象(Object Instance)与其引用关系的树状结构,同时包含了占用内存的大小和百分比。通过Dominator Tree视图可以很容易的找出占用内存最多的几个对象(根据Retained HeapPercentage排序);

在这里插入图片描述

元素介绍

GcRoots

GC Root(Garbage Collection Root)是指在Java虚拟机中被直接或间接引用的对象集合,它们被认为是存活对象,不能被垃圾回收器回收。GC Root的作用是为垃圾回收器提供一个初始的扫描位置,以便确定哪些对象是可达的,哪些对象是不可达的。垃圾回收器会从GC Root开始扫描,并标记所有可达对象,最终将不可达对象回收掉。

GC Root包括以下几种类型:

  • 虚拟机栈中引用的对象

  • 方法区中类静态属性引用的对象

  • 方法区中常量引用的对象

  • Native方法中引用的对象

  • 活动线程中的对象

  • 当前类加载器加载的类的对象

  • 例如下面的图中GCRoots没有到达 object5、object6、object7,因此他们三标记为可以被回收

在这里插入图片描述

Shallow Heap

  • Shallow Heap 为对象自身占用的内存大小,不包括它引用的对象。

Retained set

  • 对象本身和他持有引用的对象和这些对象的retained set所占内存大小的总和
    在这里插入图片描述

在这里插入图片描述

with incoming references

在这里插入图片描述

  • 对象 A 和对象 B 持有对象 C 的引用
  • 对象 C 持有对象 D 和对象 E 的引用
  • 对象 CIncoming References:拥有对象 C 的引用的所有对象都称为 Incoming references。在此示例中,对象 CIncoming references是对象 A、对象 BC 的类对象

with outgoing references

  • 对象 COutgoing References:对象 C 引用的所有对象都称为 Outgoing References。在上面图中,对象 Coutgoing references是对象 D、对象 E

参考文献

  • 一文让你理解什么是shallow heap及retained heap - 知乎 (zhihu.com)
  • Shallow Heap 和 Retained Heap的区别_shallow heap和retained heap什么区别-CSDN博客
  • JVM 内存分析神器 MAT: Incoming Vs Outgoing References 你真的了解吗?-腾讯云开发者社区-腾讯云 (tencent.com)

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

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

相关文章

使用deepspeed继续训练LLAMA

目录 1. 数据训练配置 2. 模型载入 3. 优化器设置 4. DeepSpeed 设置 5. DeepSpeed 初始化 6. 模型训练 LLAMA 模型子结构: 1. 数据训练配置 利用 PyTorch 和 Transformers 库创建数据加载器,它支持单机或多机分布式训练环境下的数据加载与采样。涉…

Uniapp(uni-app)学习与快速上手教程

Uniapp(uni-app)学习与快速上手教程 1. 简介 Uniapp是一个跨平台的前端框架,允许您使用Vue.js语法开发小程序、H5、安卓和iOS应用。下面是快速上手的步骤。 2. 创建项目 2.1 可视化界面创建 1、打开 HBuilderX,这是一款专为uni…

mysql 中文编码问题

前言 最近在学springboot整合mybatisplus技术,用到mysql数据库,然后发现在windows下插入数据表会出现中文乱码现象 (例如 “我是谁” 在数据库中就成了 “???”) windows show variables like %char%;建表时, 设置默认charset为gbk create table u…

Springboot+vue的社区养老服务平台(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的社区养老服务平台(有报告)。Javaee项目,springboot vue前后端分离项目 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的社区养老服务平台,采用M(model&…

c语言游戏实战(5):走迷宫

前言: 制作一个迷宫游戏是一个有趣的编程挑战。首先,我们需要设计一个二维数组来表示迷宫的布局,其中每个元素代表迷宫中的一个格子。我们可以使用不同的值来表示空格、墙壁和起点/终点。接下来,我们需生成迷宫。在生成迷宫的过程…

自行车 - 骑行前的准备

现在骑自行车的人越来越多了,公路车、山地车、折叠车,有通勤的,也有出来骑游的。为了更好享受骑行带给我们的乐趣,在开始骑行前,你的准备是否充分呢? 最开始,要评估一下天气情况,出车…

最近vscode链接Autodl出现的问题

最近vscode链接Autodl出现的问题 一、问题的概述 在使用vscode连接autodl远程服务器的时候,在vscode的右下角出现了,以下的问题提示: 远程主机可能不符合glibc和libstdc VS Code服务器的先决条件 二、问题的原因 vscode版本过高的问题&…

Redis篇之缓存雪崩

一、什么的缓存雪崩 缓存雪崩:在同一时间段大量的缓存key同时失效或者redis服务宕机,导致大量请求到达数据库给数据库带来巨大压力,可能导致数据库崩了。 二、应该怎么解决 1.给不同的Key的TTL添加随机值 2.利用Redis集群提高服务的可用性 3…

Blender教程(基础)-衰减编辑-20

1、新建一个平面并细分 如下图所示菜单衰减工具 选中一个点上下移动、图形形变衰减 再点击箭头上下移动过程中不要松开鼠标,此时按鼠标中键实现衰减区域的快速调节。 也可以再菜单栏输入参数调节 调节形状 shiftA添加经纬球 按数字1切换正交前视 切换…

GC调优工具

1、jstat 2、VisualVM GC tool插件 插件下载地址:https://blog.csdn.net/jushisi/article/details/109655175 3、Prometheus和Grafana监控

armbian ddns

参考https://mp.weixin.qq.com/s/0Uu_nbGH_W6vAYHPH4kHqg Releases jeessy2/ddns-go GitHub mkdir -p /usr/local/ddns-go cd /usr/local/ddns-gowget https://github.com/jeessy2/ddns-go/releases/download/v6.1.1/ddns-go_6.1.1_freebsd_armv7.tar.gztar zxvf ddns-go_…

新年祝福大家,今年是个好日子,实现100个愿望——早读

神机妙算无人知 引言引言第一篇 人民日报 夜读 今晚,我们想收集100个新年愿望第二篇 新华网 号外!新华网联合尔滨、尔佳送新春大大大大礼包啦第三篇(跳)人民日报 来了新闻早班车要闻社会政策 结尾 引言 昨天回了家 然后我就给我妹…

STM32 cubemx配置DMA+空闲中断接收不定长数据

文章目录 前言一、串口空闲中断二、DMA空闲中断接收不定长数据实现思路三、STM32Cubemx配置DMA空闲中断接收不定长数据四、代码编写总结 前言 本篇文章给大家讲解一下DMA串口空闲中断接收串口不定长数据,之前我们也是讲解过串口接收不定长数据的,那么本…

【Linux】SystemV IPC

进程间通信 一、SystemV 共享内存1. 共享内存原理2. 系统调用接口(1)创建共享内存(2)形成 key(3)测试接口(4)关联进程(5)取消关联(6)释…

CTF--Web安全--SQL注入之‘绕过方法’

一、什么是绕过注入 众所周知,SQL注入是利用源码中的漏洞进行注入的,但是有攻击手段,就会有防御手段。很多题目和网站会在源码中设置反SQL注入的机制。SQL注入中常用的命令,符号,甚至空格,会在反SQL机制中…

Kubernetes - 如何利用 K8S 拉取私有仓库镜像

问题描述 最近实战时,发现一个很奇怪的问题,在通过 k8s 创建 pod,拉取镜像时,总是显示如下信息: Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: …

Linux命令行工具使用HTTP代理的方法详解

亲爱的Linux用户们,有没有想过在命令行世界里,你的每一个指令都能悄无声息地穿越千山万水,而不被外界窥探?哈哈,没错,就是通过HTTP代理!今天,我们就来一起探索如何在Linux命令行工具…

如果通过浏览器调试?

背景:博主是一个有丰富经验的后端开发人员,在前端开发中感觉总是有种力不从心的感觉,因为没有后端debug调试的清晰感。 解决办法:掌握chorm浏览器调试技巧。 F12, F5 打上断点之后,这不就是梦寐之中的调试…

让AI更“智能”的Agent,究竟是什么?

引言 我相信对许多对AI感兴趣的读者来说,“Agent”是个听起来既熟悉又陌生的词汇,而由于ChatGPT引发的浪潮又将Agent的概念推上顶峰,正好借助这个机会我来好好解释一下这个词汇。 Agent的基本含义 在AI领域,Agent基本可以被理解…

STL之list容器的介绍与模拟实现+适配器

STL之list容器的介绍与模拟实现适配器 1. list的介绍2. list容器的使用2.1 list的定义2.2 list iterator的使用2.3 list capacity2.4 list element access2.5 list modifiers2.6 list的迭代器失效 3. list的模拟实现3.1 架构搭建3.2 迭代器3.2.1 正向迭代器3.2.2反向迭代器适配…