JVM学习-MAT

news2024/11/29 2:38:45
MAT(Memory Analyzer Tool)
基本概述
  • Java堆内存分析器,可以用于查找内存泄漏以及查看内存消耗情况
  • MAT是基于Eclipse开发的,不仅可以单独使用,还能以插件方式嵌入Eclipse中使用,是一款免费的性能分析工具
获取堆dump文件
  • dump文件内容
    • MAT可以分析heap dump文件,在进行内存分析时,只要获得了反映当前设备内存映像的hprof文件,通过MAT打开就能直观地看到当前的内存信息
    • 这些内存信息包含
      • 所有的对象信息,包括对象实例,成员变量,存储于栈中的基本数据类型值和存储于堆中的其他对象的引用值
      • 所有的类信息,包括classloader、类名称、父类、静态变量等
      • GCRoot到所有的这些对象的引用路径
      • 线程信息,包括线程的调用栈及此线程的线程局部变量(TLS)
  • 获取dump文件
    • 通过jmap工具生成,可以生成任意一个java进程的dump文件
C:\Users\Administrator\IdeaProjects\jvm>jmap -dump:format=b,file=d:\mat\a.hprof 11896
Dumping heap to D:\mat\a.hprof ...
Heap dump file created
  • 通过配置JVM参数生成
    • 选项-XX:+HeapDumpOnOutOfMemoryError 或 -XX:+HeapDumpBeforeFullGC
    • 选项 -XX:HeapDumpPath所代表的含义就是当程序出现OOM时,将会在相应目录下生成一份dump文件,如果不指定,则在当前目录生成dump文件
    • 生产环境中几乎不可能在线对其进行分析,都采用离线分析,因此使用jmap+MAT工具分析dump文件
  • 使用VisualVM可以导出堆dump文件
  • 使用MAT直接从活动Java程序中导出堆快照
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
分析堆dump文件
  • histogram(直方图):展示了各个类的实例数目以及这些实例的shallow heap或retainedheap的总和
  • thread overview
    • 查看系统中的Java线程
    • 查看局部变量的信息
  • 获取对象相互引用的关系
    • with outgoing references
      在这里插入图片描述

    • with incoming references

  • 浅堆与深堆
    • shallow heap(浅堆)
      • 浅堆是指一个对象所消耗的内存,在32位系统中,一个对象引用会占用4个字节,一个int类型会占据4个字节,long型变量占据8字节,每个对象头需要占用8个字节,根据堆快照格式不同,对象的大小可能会向8字节对齐
      • 以String为例:2个int值共占用8个字节,对象引用占用4个字节,对象头8字节,合计20字节,向8字节对齐,故占24字节,这24字节为String对象的浅堆大小,它与String的value实际值无关,无论字符串长度如何,浅堆大小始终是24字节
    • retained heap(深堆)
      • 保留集(Retained Set):对象A的保留集指当对象A被垃圾回收后,可以被释放的所有对象集合(包括对象A本身),即对象A的保留集可以被认为是只能通过对象A被直接或间接访问到的所有对象的集合,指仅被对象A所持有的对象的集合
      • 深堆:指对象的保留集中所有的对象的浅堆大小之和
      • 注:浅堆指对象本身所占用的内存,不包含其内部引用对象的大小,一个对象的深堆指只能通过该访问到的(直接或间接)所有对象的浅堆之和,即对象被回收,可以释放真实空间
    • 对象实际大小
      • 对象的实际大小定义为一个对象所能触及的所有对象的浅堆大小之和,也就是对象的大小,与深堆相比,这个在日常开发中更为直观和被人接受,但实际这个概念与垃圾回收无关
        在这里插入图片描述
  • 支配树(Dominator Tree)
    • MAT提供了一个称为支配树的对象图,支配树体现了对象实例间的支配关系。在对象引用图中,所有指向对象B的路径都经过A,则认为对象A支配对象B,如果对象A是离对象B最近的一个支配对象,则认为对象A为对象B的直接支配者,支配树是基于对象间的引用图所建立的,它有以下基本特性
      • 对象A的子树表示对象A的保留集,即深堆
      • 如果对象A支配对象B,那么对象A的直接支配者也支配对象B
      • 支配树的边与对象引用图的边不直接对应
    • 下图中,左图表示对象引用图,右图表示左图所对应的支配树,对换A,B由根对象直接支配,由于在到对象C的路径中,可以经过A,也可以经过B,因此对象C的直接支配者也是根对象,对象F与对象D相互引用,因为到对象F的所有路径必然经过对象D,因此,对象D是对象F的直接支配者,而到对象D的所有路径中,必须经过C,即从对象F到对象D的引用,从根节点出发,也是经过对象C的,所以,对象D的直接支配者为对象C,同理,对象E支配对象G,到达对象H可以通过对象D,也可以通过对象E,因此对象D和E都不能支配对象H,而经过对象C既可到达D也可到达E,因此对象C为对象H的直接支配者
      在这里插入图片描述
OQL(Object Query Language)
  • MAT支持一种类似于SQL的查询语言OQL(Object Query Language),OQL使用类SQL语法,可以在堆中进行对象的查找和筛选
  • SELECT子句
    • 在MAT中,Select子句的格式与SQL基本一致,用于指定要显示的列,Select子句中可以使用*,查看结果对象的引用实例(相当于outgoing references)。

    • SELECT * FROM java.util.Vector v
      在这里插入图片描述

    • 使用OBJECTS关键字,可以将返回结果集中的项以对象的形式显示

    • SELECT objects v.elementData FROM java.util.Vector v || SELECT OBJECTS s.value FROM java.lang.String s
      在这里插入图片描述

    • 在Select子句中,使用AS RETAINED SET关键字可以得到所得对象的保留集

    • SELECT AS RETAINED SET * FROM com.chapter11.Student

    • DISTINCT关键字用于在结果集中去除重复对象

    • SELECT DISTINCT OBJECTS classof(s) FROM java.lang.String s

  • FROM子句
    • From子句用于指定查询范围,它可以指定类名、正则表达式或者对象地址
  • WHERE子句
    • where子句用于指定OQL的查询条件,OQL查询将只返回满足where子句指定条件的对象
    • where支持多个条件AND、OR运算
  • 内置对象与方法
    • OQL可以访问堆内对象的属性,也可以访问堆内代理对象的属性,访问堆内对象的属性时格式:[.]..
    • 其中alias为对象名称

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

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

相关文章

Edge浏览器十大常见问题,一次性解决!

Edge曾被称为最好用的浏览器,拳打Chrome脚踢firefox, 可如今却隐藏着像是播放卡顿、下载缓慢、广告繁多等诸多问题,不知道各位还在用吗? 今天小编收集整理了Edge浏览器十大烦人问题,并提供简单有效的解决办法,让你的E…

65. UE5 RPG 实现远程攻击

前面,我们实现了敌人的近战普通攻击,还兼容了对于没有武器的敌人的攻击。有近战就要有远程,这一篇,我们实现一下敌人的远程攻击。 首先,由于创建的资源增多,我们将GA和GE按敌人和英雄的类别分开&#xff0c…

MPC控制简化版

MPC控制算法简化版 模型预测控制(Model Predictive Control,MPC)是一种先进的控制策略,广泛应用于人形机器人的运动控制。具体实现过程中,还需结合机器人的实际动力学模型和更多的物理约束条件。以下是一个人形机器人…

基本 MOSFET 恒流源

恒流源在电路分析练习和网络定理中占有重要地位,然后它们似乎或多或少消失了。。。除非你是IC设计师。尽管在典型 PCB 设计中很少遇到,但电流源在模拟 IC 领域却无处不在。这是因为它们 1) 用于偏置,2) 作为有源负载。 偏置: 用作…

【SkyWalking】启用apm-trace-ignore-plugin追踪忽略插件

背景 使用Agent采集追踪数据的时候,想排除某些路径,比如健康检查等,这样可以减少上报的数据,也可以去除一些不必要的干扰数据。 加载插件 在agent/optional-plugins目录中有个apm-trace-ignore-plugin-${version}.jar插件&…

Hive on Spark版本兼容性

Hive on Spark仅在特定版本的Spark上进行测试,因此给定版本的Hive只能保证与特定版本的Spark一起工作。其他版本的Spark可能与给定版本的Hive一起工作,但不能保证。以下是Hive版本及其对应的Spark版本列表: 详情参考官方文档:http…

C# 异步方法async / await 任务超时处理

一、需求 如果调用一个异步方法后,一直不给返回值结果怎么办呢?这就涉及到怎么取消任务了。 二、Task取消任务 static CancellationTokenSource source new CancellationTokenSource();static void Main(string[] args){Task.Run(() >{for (int i …

C# WPF入门学习主线篇(十)—— DataGrid常见属性和事件

C# WPF入门学习主线篇(十)—— DataGrid常见属性和事件 欢迎来到C# WPF入门学习系列的第十篇。在前面的文章中,我们已经学习了 Button、TextBox、Label、ListBox 和 ComboBox 控件。今天,我们将探讨 WPF 中的另一个重要控件——D…

CHATGPT升级plus(已有账号前提下)

注册wildcard(虚拟卡) 注册号账号后先进行充值,充值后选择CHATGPT一键升级按照他的流程来即可 Wildcard网址:Wildcard跳转注册 填写邀请码充值时少两美金合计14¥ 邀请码:OL3QXTRH

Adobe Illustrator 矢量图设计软件下载安装,Illustrator 轻松创建各种矢量图形

Adobe Illustrator,它不仅仅是一个简单的图形编辑工具,更是一个拥有丰富功能和强大性能的设计利器。 在这款软件中,用户可以通过各种精心设计的工具,轻松创建和编辑基于矢量路径的图形文件。这些矢量图形不仅具有高度的可编辑性&a…

Codeforces Round 951 (Div. 2)

A - Guess the Maximum 直接暴力枚举 a i , a i 1 a_i,a_{i1} ai​,ai1​找最小的最大值 答案即为最小的最大值-1 code: #include<bits/stdc.h> #define endl \n #define fast() ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr) #define F first #…

skywalking学习

文章目录 前言一、skywalking单体安装部署1. 下载skywalking2. 部署oap和oap-ui服务3. 测试skywalking监控springboot应用 二、搭建swck(skywalking集群)1.安装k8s2.下载swck3.设置pod自动注入java agent 三、skywalking监控python四、skywalking监控cpp总结参考 前言 本文主要…

RTKLIB之RTKPLOT画图工具

开源工具RTKLIB在业内如雷贯耳&#xff0c;其中的RTKPLOT最近正在学习&#xff0c;发现其功能之强大&#xff0c;前所未见&#xff0c;打开了新的思路。 使用思博伦GSS7000卫星导航模拟器,PosApp软件仿真一个载具位置 1&#xff0c;RTKPLOT支持DUT 串口直接输出的NMEA数据并…

HCL模拟器下做M-LAG测试(以及和华为配置对比)-二层架构

1.简单二层架构 1.1 拓扑图 1.2 配置 1.2.1 Leaf1配置 system-mac必须配置&#xff0c;否则会有一个node处于unknown状态&#xff0c;即使配置主节点的mac&#xff0c;主节点也需要配置system-mac为自己的mac ## M-LAG配置[Leaf1] m-lag system-mac 0001-0001-0001 # 手动设…

MFC 教程-回车时窗口退出问题

【问题描述】 MFC窗口默认时&#xff0c;按回车窗口会退出 【原因分析】 默认调用OnOK() 【解决办法】 重写虚函PreTranslateMessage BOOL CTESTMFCDlg::PreTranslateMessage(MSG* pMsg) {// TODO: 在此添加专用代码和/或调用基类// 修改回车键的操作反应 if (pMsg->…

物理安全防护如何创新强化信息安全体系?

物理安全防护是信息安全体系的重要组成部分&#xff0c;它通过保护实体设施、设备和介质等&#xff0c;防止未授权访问、破坏、盗窃等行为&#xff0c;从而为信息系统提供基础的安全保障。要创新强化信息安全体系中的物理安全防护&#xff0c;可以从以下几个方面着手&#xff1…

企业数字化转型的测度难题:基于大语言模型的新方法与新发现

《经济研究》新文章《企业数字化转型的测度难题&#xff1a;基于大语言模型的新方法与新发现》运用机器学习和大语言模型构造一套新的企业数字化转型指标。理论分析和数据交叉验证均表明&#xff0c;构建的指标相对已有方法更准确&#xff1a; 1.第一步&#xff1a;选择“管理…

Redis常用命令——List篇

提到List&#xff0c;我们第一时间想到的就是链表。但是在Redis中&#xff0c;List更像是一种双端队列&#xff0c;例如C中的deque。它可以快速高效的对头部和尾部进行插入和删除操作。本片文章主要对List列表的相关命令进行详解&#xff0c;希望本篇文章会对你有所帮助。 文章…

js--hasOwnProperty()讲解与使用

@TOC 前言 hasOwnProperty(propertyName)方法 是用来检测属性是否为对象的自有属性 object.hasOwnProperty(propertyName) // true/false 讲解 hasOwnProperty() 方法是 Object 的原型方法(也称实例方法),它定义在 Object.prototype 对象之上,所有 Object 的实例对象都会继…

高考志愿选专业,如何分析自己的兴趣爱好?

之所以在选择专业的时候比较迷茫&#xff0c;就是对自己不够了解&#xff0c;没有分析过自己的兴趣爱好&#xff0c;所以也不知道如何选择适合自己的专业&#xff0c;但是他们又不得不做出更深入的了解&#xff0c;因为专业的选择将关系到未来的职业道路和生活方向。 对于绝大…