# 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.mfbz.cn/a/381414.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud-Ribbon实现负载均衡

在微服务架构中,负载均衡是一项关键的技术,它可以确保各个服务节点间的负载分布均匀,提高整个系统的稳定性和性能。Spring Cloud 中的 Ribbon 就是一种负载均衡的解决方案,本文将深入探讨 Ribbon 的原理和在微服务中的应用。 一、…

外包干了一个月,技术明显进步。。。。

先说一下自己的情况,本科生,19年通过校招进入南京某软件公司,干了接近2年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…

CSP-202012-1-期末预测之安全指数

CSP-202012-1-期末预测之安全指数 题目很简单&#xff0c;直接上代码 #include <iostream> using namespace std; int main() {int n, sum 0;cin >> n;for (int i 0; i < n; i){int w, score;cin >> w >> score;sum w * score;}if (sum > 0…

STM32——OLED(2)

目录 一、OLED显示屏介绍 引脚说明&#xff1a; 二、OLED驱动 1. 基本认识 2. OLED 驱动原理 及过程 三、SSD1306工作时序 (8080时序&#xff09; 1. 8080并口读/写过程 2. SSD1306工作时序 (8080时序) 四、屏幕显示 1. GRAM 补&#xff1a; 2. 画点原理 3. 显示字…

尚硅谷 Vue3+TypeScript 学习笔记(中)

目录 三、路由 3.1. 【对路由的理解】 3.2. 【基本切换效果】 3.3. 【两个注意点】 3.4.【路由器工作模式】 3.5. 【to的两种写法】 3.6. 【命名路由】 3.7. 【嵌套路由】 3.8. 【路由传参】 query参数 params参数 3.9. 【路由的props配置】 3.10. 【 replace属性…

Java实现快乐贩卖馆管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 搞笑视频模块2.3 视频收藏模块2.4 视频评分模块2.5 视频交易模块2.6 视频好友模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 搞笑视频表3.2.2 视频收藏表3.2.3 视频评分表3.2.4 视频交易表 四、系…

Zustand:简化状态管理的现代React状态库

Zustand&#xff1a;简化状态管理的现代React状态库 Zustand是一个用于管理状态的现代React状态库。它提供了简洁、可扩展和高效的状态管理解决方案&#xff0c;使得在React应用中处理复杂的状态逻辑变得更加容易和直观。本文将介绍Zustand的主要特点、使用方法以及它在React开…

vim常用命令以及配置文件

layout: article title: “vim文本编译器” vim文本编辑器 有三种模式: 命令模式 文本模式, 末行模式 vim命令大全 - 知乎 (zhihu.com) 命令模式 插入 i: 切换到输入模式&#xff0c;在光标当前位置开始输入文本。 a: 进入插入模式&#xff0c;在光标下一个位置开始输入文…

JavaWeb02-MyBatis

目录 一、MyBatis 1.概述 2.JavaEE三层架构简单介绍 &#xff08;1&#xff09;表现层 &#xff08;2&#xff09;业务层 &#xff08;3&#xff09;持久层 3.框架 4.优势 &#xff08;1&#xff09;JDBC的劣势 &#xff08;2&#xff09;MyBatis优化 5.使用 &#…

算法刷题:移动零

移动零 .题目链接详解curdesc算法原理 答案 . 题目链接 移动零 详解 题目要求我们要把数组中所有的零都移动到数组的末尾,且要求其余数字顺序不改变.这道题,我们使用到的是双指针算法: 利用两个指针,将数组分为三个部分, 三个区间分别为 [0,desc][desc1,cur-1][cur,n-1] 在…

HTML 标签

HTML&#xff1a;超文本标记语言 HTML骨架结构&#xff1a; html标签&#xff1a;网页的整体 head标签&#xff1a;网页的头部 body标签&#xff1a;网页的身体 HTML的注释 VS code中&#xff1a;ctrl/ 浏览器不会执行注释 HTML标签的构成&#xff1a; 双标签&#xff1a…

DC-9靶机渗透详细流程

信息收集&#xff1a; 1.存活扫描&#xff1a; arp-scan -I eth0 -l 发现靶机ip&#xff1a;192.168.10.132 └─# arp-scan -I eth0 -l 192.168.10.1 00:50:56:c0:00:08 (Unknown) 192.168.10.2 00:50:56:e5:b1:08 (Unknown) 192.168.10.132 //靶机 00:0c…

物联网和工业4.0

在当今这个快速发展的技术时代&#xff0c;物联网&#xff08;IoT&#xff09;和工业4.0成为了推动全球进入新工业时代的两大驱动力。对于刚入行的人来说&#xff0c;深入理解这两个概念及其背后的技术原理&#xff0c;对于把握未来的职业机会至关重要。 物联网&#xff0c;简…

备战蓝桥杯---动态规划(理论基础)

目录 动态规划的概念&#xff1a; 解决多阶段决策过程最优化的一种方法 阶段&#xff1a; 状态&#xff1a; 决策&#xff1a; 策略&#xff1a; 状态转移方程&#xff1a; 适用的基本条件 1.具有相同的子问题 2.满足最优子结构 3.满足无后效性 动态规划的实现方式…

Go内存优化与垃圾收集

Go提供了自动化的内存管理机制&#xff0c;但在某些情况下需要更精细的微调从而避免发生OOM错误。本文介绍了如何通过微调GOGC和GOMEMLIMIT在性能和内存效率之间取得平衡&#xff0c;并尽量避免OOM的产生。原文: Memory Optimization and Garbage Collector Management in Go 本…

2024-02-08(Flume)

1.Flume 的架构和MQ消息队列有点类似 2.Flume也可以做数据的持久化操作 在Channel部分选择使用File channel组件 3.Flume进行日志文件监控 场景&#xff1a;企业中应用程序部署后会将日志写入到文件中&#xff0c;我们可以使用Flume从各个日志文件将日志收集到日志中心以便…

用bootstrap结合jQuery实现简单的模态对话框

嗨害嗨&#xff0c;我又来了奥。今天呢&#xff0c;给大家分享一个工作中常用到的插件——模态对话框的用法。想必大家在工作中也遇到很多页面&#xff0c;需要用模态对话框进行交互的吧&#xff0c;现在呢&#xff0c;就让我们一起来了解一下它的使用吧。 首先&#xff0c;我…

Dlib检测人脸特征点标号图

dlib进行人脸检测时候&#xff0c;所有人脸的标号图&#xff0c;c检索的时候注意从0索引开始

Infuse通过Alist添加115网盘资源

说明 通过Alist代理管理115网盘&#xff0c;Infuse再添加Alist代理的115网盘的WebDAV 准备一台Linux服务器安装Alist 我这里用的华为云CentOS7&#xff0c;使用Docker容器 安装Alist docker run -d --restartalways -v /etc/alist:/opt/alist/data -p 5244:5244 -e PUID0 …

深入浅出:Golang的Crypto/SHA256库实战指南

深入浅出&#xff1a;Golang的Crypto/SHA256库实战指南 介绍crypto/sha256库概览主要功能应用场景库结构和接口实例 基础使用教程字符串哈希化文件哈希化处理大型数据 进阶使用方法增量哈希计算使用Salt增强安全性多线程哈希计算 实际案例分析案例一&#xff1a;安全用户认证系…
最新文章