# 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://xiahunao.cn/news/2776255.html

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

相关文章

LLM大语言模型(六):RAG模式下基于PostgreSQL pgvector插件实现vector向量相似性检索

目录 HightLightMac上安装PostgreSQLDBever图形界面管理端创建DB 使用向量检索vector相似度计算近似近邻索引HNSW近似近邻索引示例 HightLight 使用PostgreSQL来存储和检索vector,在数据规模非庞大的情况下,简单高效。 可以和在线业务共用一套DB&#…

响应式编程详解(持续更新)

响应式编程 1.多维度看全景1.1响应式编程(Reactive Programming )1.2函数式编程(Functional Programming, 简称FP)1.3技术演进1.4Rx是什么1.5[响应式宣言](https://www.reactivemanifesto.org/zh-CN) 2.钻进去看本质2.1名称解释(rajava)2.2观察者模式2.3…

保护我方水晶,2024 数据库安全工具盘点

在数据价值堪比石油的数字时代,对每个组织而言,保护这一核心资产显得尤为重要。无论是来自外部的黑客攻击和恶意软件,还是源于内部的人为失误和内鬼行为,威胁无处不在。本文将介绍几款先进的数据库安全工具,从不同维度…

第一章 整车EE架构和软件发展情况

第一章 整车EE架构的基本介绍和发展 1. 架构形态 整车架构形态目前呈三种阶段:分布式阶段、域内集中阶段、中央计算阶段 分布式阶段 域内集中阶段 中央计算阶段 2. 架构特点 分布式阶段 各个ECU是完全分离的,且算力较低,只能实现较为简单…

一、OpenAI API介绍

Open AI API可以应用到任何的业务场景。 文本生成 创造助理 嵌入数据 语音转化 图片生成 图片输入 1. 核心概念 1.1 Text generation models OpenAI 的文本生成模型(通常被称为generative pre-trained transformers 模型简称:GPT),有GPT-4和G…

安全基础~通用漏洞4

文章目录 知识补充XSS跨站脚本**原理****攻击类型**XSS-后台植入Cookie&表单劫持XSS-Flash钓鱼配合MSF捆绑上线ctfshow XSS靶场练习 知识补充 SQL注入小迪讲解 文件上传小迪讲解 文件上传中间件解析 XSS跨站脚本 xss平台: https://xss.pt/ 原理 恶意攻击者…

Qlik Sense : where exists

什么是Exists函数 Exists() 用于确定是否已经将特定字段值加载到数据加载脚本中的字段。此函数用于返回 TRUE 或 FALSE,这样它可以用于 LOAD 语句或 IF 语句中的 where 子句。 信息注释您也可使用 Not Exists() 来确定是否尚未加载字段值,但是如果要在…

那些 C语言指针 你不知道的小秘密 (3)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能…

正版软件 - Proxyman:让网络调试变得更智能、更高效

在软件开发的世界里,网络调试一直是开发者和测试工程师的痛点。传统的调试工具往往操作复杂,界面不够直观,而且性能上也难以满足现代应用的需求。今天,我要向大家介绍一款名为Proxyman的网络调试工具,它以其简洁的界面…

ssm+vue的医药垃圾分类管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频: ssmvue的医药垃圾分类管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结…

C语言笔试题之两数相加(多次反转链表实现)

实例要求: 1、给定两个非空链表(l1和l2)来代表两个非负整数;2、数字最高位位于链表开始位置;3、它们的每个节点只存储一位数字;4、将这两数相加会返回一个新的链表; 案例展示: 实例…

MySQL学习记录——칠 表操作

文章目录 1、了解2、创建和插入1、基本创建和插入2、插入并更新on duplicate3、插入并替换replace 3、Retrieve1、查询select2、条件查询where3、结果排序order by4、限制行数limit 4、更新Update5、删除delete6、去重7、聚合函数(5个)1、count2、sum3、…

【蓝桥杯单片机记录】IO基础与LED控制

目录 一、IO基础 1.1 IAP15F2K61S2芯片原理图 1.2不同工作模式 二、新建工程的一些补充 2.1 keil中没有IAP15F2K61S2的头文件 解决:在isp软件中找到如下​编辑 2.2keil中的芯片选择 2.3推荐字体 三、sbit关键字 四、LED控制 4.1原理图 4.2不能直接通过IO…

Token、Tokenization 和张量之间的关系

输入经过Tokenization、Embedding和Positional Encoding后,最终构建为张量,给后续的计算和处理带来很多优势。 1. tokenization和张量 在自然语言处理(NLP)领域中,tokenization 是文本预处理的重要步骤之一&#xff0…

【漏洞复现】SpringBlade export-user接口存在SQL注入漏洞

漏洞描述 SpringBlade 是一个由商业级项目升级优化而来的微服务架构 采用Spring Boot 2.7 、Spring Cloud 2021 等核心技术构建,完全遵循阿里巴巴编码规范。提供基于React和Vue的两个前端框架用于快速搭建企业级的SaaS多租户微服务平台。SpringBlade export-user接口存在SQL注…

【踏雪无痕的痕一】——认知的心病

目录 一、背景介绍二、思路&方案三、过程1.教育是最大的"炸片"2.逻辑对等性的认知(时间的保证)3.不要去猜一个人怎么想,要看一个人怎么做4.改变一个人的基础5.你想过和你能过上什么生活完全取决于你自己 四、总结 一、背景介绍 大多数人都只愿意看到…

Blazor Wasm Google 登录

目录: OpenID 与 OAuth2 基础知识Blazor wasm Google 登录Blazor wasm Gitee 码云登录Blazor SSR/WASM IDS/OIDC 单点登录授权实例1-建立和配置IDS身份验证服务Blazor SSR/WASM IDS/OIDC 单点登录授权实例2-登录信息组件wasmBlazor SSR/WASM IDS/OIDC 单点登录授权实例3-服务端…

给大家拜年啦!最全科研资料,新年促销优惠!机器学习预测全家桶/故障诊断全家桶/改进算法/Python,Matlab代码...

最近后台有不少小伙伴问到,新年有没有什么优惠价,您这也不搞个活动吗! 本期作者郑重推出几个比较受欢迎的全家桶!一律7折优惠!每个商品仅限5次购买机会,也就是说,满5个人后,该商品会…

Stable Diffusion 模型下载:GhostMix(幽灵混合)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 GhostMix 是绝对让你惊艳的模型,也是自己认为现在最强的2.5D模型。我认为模型的更新应该是基于现有的画面整体不大变的前提下,提高模型的成…

使用Arcgis裁剪

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、掩膜提取二、随意裁剪三、裁剪 前言 因为从网站下载的是全球气候数据,而我们需要截取成中国部分,需要用到Arcgis的裁剪工具 一、掩…