当前位置: 首页 > news >正文

JVM学习-MAT

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
      • 支配树的边与对象引用图的边不直接对应
支持使用OQL语言查询对象信息

待续… …

相关文章:

JVM学习-MAT

MAT(Memory Analyzer Tool) 基本概述 Java堆内存分析器,可以用于查找内存泄漏以及查看内存消耗情况MAT是基于Eclipse开发的,不仅可以单独使用,还能以插件方式嵌入Eclipse中使用,是一款免费的性能分析工具 获取堆dump文件 dump…...

高通Android 12/13实现USB拔出关机功能

思路流程 1、监听广播->接受USB断开或者USB不充电广播->执行关机逻辑 涉及类 UsbManager/UsbDeviceManager \frameworks\base\services\usb\java\com\android\server\usb\UsbDeviceManager.java \frameworks\base\services\com\android\hardware\usb\UsbManager.java 2…...

用Python打造你的微博热搜追踪器

简介 在当今信息爆炸的时代,获取最新、最热门的信息成为了许多人的日常需求。微博热搜榜作为反映社会热点和公众关注焦点的重要窗口,其信息价值不言而喻。本文将介绍一个实用的Python爬虫程序,它能够自动爬取微博热搜榜的信息,并…...

TypeScript 在前端开发中的应用

TypeScript 在前端开发中的应用非常广泛。以下是一些常见的应用场景: 类型检查:TypeScript 是 JavaScript 的超集,它引入了静态类型检查。在开发过程中,TypeScript 编译器可以帮助开发者捕捉潜在的类型错误,提前发现并…...

【ArcGIS微课1000例】0115:字段数据类型案例详解

文章目录 一、ArcGIS数据类型概述二、案例1. 数字2. 文本3. 日期4. BLOB5. 对象标识符6. 全局标识符一、ArcGIS数据类型概述 创建要素类和表时,需要为各字段选择数据类型。可用的类型包括多种数字类型、文本类型、日期类型、二进制大对象 (BLOB) 或全局唯一标识符 (GUID)。选…...

ABC318-D

问题陈述 给你一个加权无向完整图&#xff0c;图中有 &#x1d441;N 个顶点&#xff0c;编号从 11 到 &#x1d441;N 。连接顶点 &#x1d456;i 和 &#x1d457;j 的边 (&#x1d456;<&#x1d457;)(i<j) 的边的长度与 (&#x1d456;<&#x1d457;)(i<j) …...

Java实现线程安全的单例模式

单例模式&#xff1a;保证某个类在程序中只存在唯⼀⼀份实例&#xff0c;而不会创建出多个实例&#xff0c;单例模式的类一般是构造器私有&#xff0c;通过一个方法返回唯一实例&#xff1b; 点这里查看线程安全的详细讲解&#xff1b; 常见的单例模式分为饿汉式和懒汉式 一…...

osg库的下载和安装

下载 下载地址:https://github.com/openscenegraph/OpenSceneGraph 安装 打开Cmake.exe,将上述下载的osg文件下的CMakeLists.txt文件拖入Cmake界面中。 在其路径下新建一个build文件 并配置cmake,点击Configure 修改如下几个选项 ACTUAL_3RDPARTY_DIR BUILD_OSG_EXAM…...

HTML、ASP.NET、XML、Javascript、DIV+CSS、JQuery、AJax的起源与简介

目录 HTML简介: 起源&#xff1a; ASP.NET简介&#xff1a; 起源: XML简介: 起源: JavaScript简介&#xff1a; 起源: DIVCSS简介: 起源&#xff1a; JQuery简介: 起源: AJax简介&#xff1a; HTML简介: HTML(Hyper Text Markup Language&#xff0c;超文本标记语言…...

SpringCloud微服务远程接口调用

一、概念 使用springcloud将项目拆分成一个一个微服务之后&#xff0c;微服务之间的接口调用就需要通过远程的方式实现&#xff0c;这里将介绍springcloud提供的两个微服务组件来介绍如何进行微服务间的远程接口调用。 1、使用RestTEmplate LoadBalanced来实现远程接口调用及…...

MySQL优化器的SQL重写规则

MySQL优化器的SQL重写规则 MySQL优化器的SQL重写规则&#xff1a;MySQL优化器会根据一定的规则对输入的SQL在保证含义不变的情况下进行SQL的优化重写。 1. 条件简化 1.1 移除不必要的括号 例如&#xff1a; ((a 5 AND b c) OR ((a > c) AND (c < 5))); --优化后 (a…...

57.void指针(万能指针)

目录 一.什么是void指针 二.视频教程 一.什么是void指针 在定义变量的时候&#xff0c;需要用到变量的类型&#xff0c;变量的类型在表示在内存中的大小&#xff0c;而void是空&#xff0c;表示的是无类型。所以如果用void来定义一个变量会发生错误&#xff08;无法在内存中挖…...

国科大-智能计算系统(AICS)期末试题(2024春)

国科大-智能计算系统期末试题&#xff08;2024春&#xff09; 填空题简答题最后一道大题 部分题目记录 填空题 卷积层中&#xff0c;input维度为16322020&#xff0c;filter维度为1283233&#xff0c;stride2&#xff0c;pad_left pad_top 0,pad_right pad_bottom 1,outpu…...

训练Pytorch深度学习模型出现StopIteration

训练一个深度学习检测模型&#xff0c;突然出现&#xff1a; 是因为next(batch_iterator)&#xff0c;可能迭代器读出来的数据为空。 # load train data# 原先代码images, targets next(batch_iterator)# 更改为&#xff1a;try:images, targets next(batch_iterator)except…...

windows上安装MongoDB,springboot整合MongoDB

上一篇文章已经通过在Ubuntu上安装MongoDB详细介绍了MongoDB的各种命令用法。 Ubuntu上安装、使用MongoDB详细教程https://blog.csdn.net/heyl163_/article/details/133781878 这篇文章介绍一下在windows上安装MongoDB&#xff0c;并通过在springboot项目中使用MongoDB记录用户…...

python_04

37、列表推导式 # 作用&#xff1a;快速生成列表 # 列表变量名 [x for x in range(开始值&#xff0c;结束值&#xff0c;步长) if 条件] # 注意&#xff1a;左闭右开 list1 [i for i in range(0,100)] print(list1) # list1 [i for i in range(0,100)] # print(list1)list…...

音视频视频点播

视频点播是集音视频采集&#xff0c;编辑&#xff0c;上传&#xff0c;自动化转码处理&#xff0c;媒体资源管理&#xff0c;高效云剪辑处理&#xff0c;分发加速&#xff0c;视频播放于一体的一站式音视频点播解决方案 阿里云视频点播基于阿里云强大的基础设施服务&#xff0c…...

Git常用命令1

1、设置用户签名 ①基本语法&#xff1a; git config --global user.name 用户名 git config --global user.email 邮箱 ②实际操作 ③查询是否设置成功 cat ~/.gitconfig 注&#xff1a;签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交…...

Nextjs使用教程

一.手动创建项目 建议看这个中文网站文档,这个里面的案例配置都是手动的,也可以往下看我这个博客一步步操作 1.在目录下执行下面命令,初始化package.json文件 npm init -y2.安装react相关包以及next包 yarn add next react react-dom // 或者 npm install --save next react…...

mysql的增删查改(进阶)

目录 一. 更复杂的新增 二. 查询 2.1 聚合查询 COUNT SUM AVG MAX MIN 2.1.2 分组查询 group by 子句 2.1.3 HAVING 2.2 联合查询/多表查询 2.2.1 内连接 2.2.2 外连接 2.2.3 全外连接 2.2.4 自连接 2.2.5 子查询 2.2.6 合并查询 一. 更复杂的新增 将从表名查询到…...

Docker---容器编排工具Docker Compose

Docker Compose核心功能使用YAML文件定义多容器应用一键启动/停止/重建整个应用栈管理服务依赖关系与网络配置环境变量集中管理&#xff0c;适配多环境部署核心概念层级Service&#xff08;服务&#xff09;&#xff1a;一个应用组件&#xff0c;可包含多个相同镜像的容器实例P…...

告别数据打架:手把手教你用Python+Seurat整合单细胞数据,无缝衔接scVelo做RNA速率分析

告别数据打架&#xff1a;手把手教你用PythonSeurat整合单细胞数据&#xff0c;无缝衔接scVelo做RNA速率分析 单细胞测序技术的快速发展为生物医学研究带来了前所未有的分辨率&#xff0c;但不同分析工具之间的数据格式壁垒常常让研究者头疼。特别是当我们需要在R语言的Seurat和…...

面试官最爱问的哈希表实战:用C++手撕‘存在重复元素II’(附滑动窗口优化思路)

哈希表实战&#xff1a;从暴力解法到最优解法的完整思维路径 在技术面试中&#xff0c;哈希表相关题目几乎是必考内容&#xff0c;而"存在重复元素II"这类问题更是高频出现。这道看似简单的题目背后&#xff0c;隐藏着对候选人算法思维、编码能力和沟通表达的全面考察…...

NovelAI:从文本生成到内容创作的AIGC实践

1. NovelAI&#xff1a;你的AI创作助手 第一次接触NovelAI时&#xff0c;我正被一篇商业方案折磨得焦头烂额。凌晨三点的咖啡杯旁&#xff0c;这个基于GPT模型的AI工具在15分钟内就帮我完成了初稿框架&#xff0c;那一刻我就知道&#xff0c;内容创作的方式正在被重新定义。Nov…...

程序员鼓励师的消亡:当ChatGPT学会调情时

凌晨三点的代码战场凌晨三点的办公室&#xff0c;最后一行代码刚刚通过测试。疲惫的测试工程师瘫在椅上&#xff0c;屏幕右下角突然弹出消息&#xff1a;“亲爱的debug战士&#xff0c;今天的你又一次战胜了bug宇宙呢~&#xff08;眨眼emoji&#xff09;”。这不是人类同事的关…...

OpenClaw自动化视频处理:Qwen2.5-VL-7B分析关键帧生成视频摘要

OpenClaw自动化视频处理&#xff1a;Qwen2.5-VL-7B分析关键帧生成视频摘要 1. 为什么需要自动化视频摘要 作为一个经常需要处理大量视频素材的自媒体创作者&#xff0c;我长期被一个痛点困扰&#xff1a;如何快速了解长视频的核心内容。传统方法要么是手动拖动进度条随机查看…...

C++ 内存管理:从unique_ptr到内存泄漏

引言 在C++编程中,智能指针是管理动态内存的重要工具。它们通过自动管理内存分配和释放,极大减少了程序员的手动管理负担。然而,尽管unique_ptr被设计为一个所有权唯一的智能指针,它仍然可能导致内存泄漏或资源循环引用。本文将通过一个实际例子来探讨unique_ptr如何在不经…...

AI命理工具实测:主流大模型八字紫微能力对比及避坑指南

1. AI命理新风向&#xff1a;当大模型碰撞传统术数 最近身边刮起了一阵“AI命理”的热潮&#xff1a;做开发的朋友电脑里存着排盘工具包&#xff0c;运营岗的同事午休时在研究紫微斗数星曜含义&#xff0c;就连开策划会的间隙&#xff0c;都有人拿着AI输出的六爻结果讨论项目走…...

Qwen3-14B日志分析教程:ELK栈收集推理请求、响应、错误全链路追踪

Qwen3-14B日志分析教程&#xff1a;ELK栈收集推理请求、响应、错误全链路追踪 1. 为什么需要日志分析 当你在私有化部署Qwen3-14B模型时&#xff0c;可能会遇到各种问题&#xff1a;为什么推理速度突然变慢了&#xff1f;为什么API返回了错误响应&#xff1f;哪些请求消耗了最…...

群晖更换RAID类型无需重建服务,保持Volume磁盘盘符不变

我的环境&#xff1a;DSM型号&#xff1a;DS3617xs&#xff08;黑群晖&#xff09;系统版本&#xff1a;DSM 7.1.1-42962 Update 6硬盘数据库更新时间&#xff1a;2026-01-23更改前磁盘序号&#xff08;btrfs&#xff09;&#xff1a;Raid1&#xff08;volume1&#xff09;&…...