MAT查找类(岔路口)-技巧

news2025/7/21 23:37:15

文章目录

  • 前言
  • 一、现状
  • 二、使用步骤
    • 1.导出 hprof
    • 2.用MAT打开
    • 3.细节操作
      • 找大对象的线程名称
      • 查看线程的详情
      • 查找类的GC Roots
      • 柳暗花明
      • 检验真理
  • 总结


前言

又是java 内存溢出 OOM
JAVA MAT 分析工具大大的好。
高效查找问题根源,才是硬道理。


一、现状

  1. mat 打开hprof 文件,可以一眼看到内存占用最多的类。
  2. 但是这个类并不是我自己创建的类。
  3. 怎么确定这个类和我的业务流程是有关联呢。
  4. 那就是找到这个类在业务流程的入口(岔路口)。

二、使用步骤

1.导出 hprof

命令如下

jmap -dump:live,format=b,file=dumextra05.hprof  486424

2.用MAT打开

一眼望去,简单明了,就是你:ResultSetImpl, 就是你占的最多。
在这里插入图片描述

3.细节操作

找大对象的线程名称

左上箭头(dominator_tree)点一下,找到第一行(默认第一个占用最大)右击
看图
在这里插入图片描述
接下来就看到线程名字如下:
在这里插入图片描述

查看线程的详情

左上小黄轮(thread_overview)点击,找到线程名称。
在这里插入图片描述
右击->点击[Thread Details]
在这里插入图片描述
看到详情,这个界面看着比较顺眼(java 报错信息也是像这种一片红)
其中有个类是我自己定义的,说明这个大内存对象和我的业务流程是有点联系(还需继续确认)。
在这里插入图片描述

查找类的GC Roots

回到dominator_tree界面,在第一列最上方有个搜索框,输入自己的业务类“ExcelExportSqlStreamHandle”,回车
在这里插入图片描述
右键点击第二行(前面有 class 开头)
在这里插入图片描述
到如下界面,全部展开,对我们有用的信息其实就是前面几行,到有线程名称(蓝色)那行。
这里没有大内存对象(ResultSetImpl), 无法判断内存超载是和我们的业务流程有联系。
还得继续操作。
在这里插入图片描述

柳暗花明

回到dominator_tree,如上刚才操作查看 “ResultSetImpl”的GC Roots信息

在这里插入图片描述
然后就是眼力对比(目前我只能这么做)
根据耐心 + 眼力, 隐约浮现一个类 “PreparedStatementHandler”。
此类双方都存在,且下一行的线程名称(黄箭头)都是一样。
所有我敢保证此类就是传说中的岔路口
在这里插入图片描述

检验真理

使用 IDEA debugger 模式运行
在“ResultSetImpl” 所有构造方法打断点(因为我也不知道进哪个)。
果然鱼上钩了,程序进来了。
看左下线程栈,有“PreparedStatementHandler”
在这里插入图片描述
在自己的业务类“ExcelExportSqlStreamHandle”的业务方法也打断点。
左下线程栈也有“PreparedStatementHandler”
在这里插入图片描述
点击“PreparedStatementHandler”查看:
execute 那行代码进去之后就是引起大内存对象产生,实际执行的就是mybatis 查询,我的业务流程就是查询很多条数据。
handleCursorResultSets 那行代码就是进到我自己的业务流程,这里的 resultSetHandler 就是我的业务类ExcelExportSqlStreamHandle 的父类。
分别从上一行(黄箭头)也能看出来,下一步是什么方法
在这里插入图片描述


总结

多实践。
之前很少用MAT,本来不是很熟悉,花了一天各种点点,摸索出来这种查找技巧。


—————— 但行好事莫问前程,你若盛开蝴蝶自来

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

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

相关文章

app.json: [“usingComponents“][“van-icon“]: “@vant/weapp/icon/index“ 未找到

维护一个微信小程序的项目,运行报错如下: app.json: ["usingComponents"]["van-icon"]: "vant/weapp/icon/index" 未找到解决办法 我只说我用到的,如果解决不了你的问题,详细的可以参照官方文档&…

git的介绍和安装、常用命令、忽略文件

git介绍和安装 首页功能写完了 ⇢ \dashrightarrow ⇢ 正常应该提交到版本仓库 ⇢ \dashrightarrow ⇢ 大家都能看到这个 ⇢ \dashrightarrow ⇢ 运维应该把现在这个项目部署到测试环境中 ⇢ \dashrightarrow ⇢ 测试开始测试 ⇢ \dashrightarrow ⇢ 客户可以看到目前做的…

使用 Python 和蒙特卡罗计算未来股价走势以及历史波动率和隐含波动率

一、简介 预测金融市场是定量精度和全球经济细微差别的复杂融合。在这一探索中,蒙特卡罗模拟脱颖而出,成为首要的统计工具,指导我们对未来股票价格的理解。 这种方法以摩纳哥著名的蒙特卡洛赌场命名,并不依靠运气,而是植根于严格的概率模型。想象一下在受控环境中精心策划…

Jmeter执行接口自动化测试-如何初始化清空旧数据

需求分析: 每次执行完自动化测试,我们不会执行删除接口把数据删除,而需要留着手工测试,此时会导致下次执行测试有旧数据我们手工可能也会新增数据,导致下次执行自动化测试有旧数据 下面介绍两种清空数据的方法 一、通过…

DIN模型和SIM模型原理与实践

文章目录 1.DIN模型原理缺点 2.SIM模型原理算法步骤1.查找2.注意力机制 参考文献 1.DIN模型 原理 计算用户Last N向量的加权平均权重是候选物品与Last N物品的相似度 缺点 注意力层的计算量正比于n(用户行为序列的长度)只能记录最近的几百个物品&…

HANA:计算视图-图形化Aggregation组件-踩坑小记(注意事项)

今天遇到在做HANA视图开发的时候,遇到一个事,一直以为是个BUG,可把我气坏了,具体逻辑是这样的,是勇图形化处理的,ACDOCA innerjoin 一个时间维度表,就这么简单,完全按照ACDOCA的主键…

​换电站:一个「利用户、利蔚来、利电力改革」的能源产品

换电的本质是什么? 我相信连蔚来车主自己也不是很清楚,不就是目前体验最接近油车的补能方式吗,还有什么? 「换电站是分布在城市中的采集和存储能源的触点,除了可为电动车用户加电,将来结合储能还有很多想象…

PAM从入门到精通(四)

接前一篇文章:PAM从入门到精通(三) 本文参考: 《The Linux-PAM Application Developers Guide》 先再来重温一下PAM系统架构: 更加形象的形式: 五、主要函数详解 1. pam_start 概述: PAM事务…

添加Mybatis框架支持

配置环境 1.老项目 在pom.xml中使用generate ->edit starts->添加下面俩 2.新项目 然后运行发现会有报错 2.1这是因为没有配置数据库连接信息 spring:datasource:url: jdbc:mysql://localhost:3306/java2023?characterEncodingutf8&useSSLfalse # MySQL数…

2024泰晤士世界大学排名公布(附Top200榜单)

近日,泰晤士高等教育世界大学排名(THE)发布了2024世界大学榜单,这表明全球高等教育领域的四大主流排名(QS、U.S. News、ARWU、THE)都已经尘埃落定。知识人网小编整理了泰晤士TOP前200的榜单,供访…

数据挖掘十大算法--Apriori算法

一、Apriori 算法概述 Apriori 算法是一种用于关联规则挖掘的经典算法。它用于在大规模数据集中发现频繁项集,进而生成关联规则。关联规则揭示了数据集中项之间的关联关系,常被用于市场篮分析、推荐系统等应用。 以下是 Apriori 算法的基本概述&#x…

发面试题:(四)synchronized和lock区别

synchronized 关键字 synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它 修饰的方法或者代码块在任意时刻只能有一个线程执行。 另外,在 Java 早期版本中, synchronized属于重量级锁,效率…

20-数据结构-内部排序-插入排序

简介:插入排序基本有两步,先是通过比较,得到插入位置,随后移动给需要插入的位置处腾空,最后进行值的插入。 目录 一、直接插入排序 1.1简介: 1.2代码 二、折半插入排序 2.1简介: 2.2代码…

vue项目获得开源代码之后跳过登录界面

readme运行 进入到账号和密码 找到main.js 比如说,以上这段代码 剩下next()就成功进入了

SAP MM学习笔记37 - 请求书照合中的 追加请求/追加Credit 等概念/ 请求书的取消

有关请求书照合,之前学习了一部分,现在再来学其中的一些概念。 其实这些概念也许并不常用,但是你又不能不知道,因为客户会问。 有关请求书,贴一些以前学习的文章,以方便阅读。 SAP MM学习笔记33 - 请求书…

雷达人体感应器成品方案,智能化空间联动交互,人体存在触发应用

随着科技的快速发展,智能化已经成为我们生活中不可或缺的一部分。在酒店、会议室和办公室等场合,智能化更是显得尤为重要。 智能雷达感应器成品设备能够实时监测人体的静止存在,精准地探测人体存在,进而触发联动设备,…

【C++】BMI身体质量指数计算工具

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍BMI身体质量指数计算工具。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷…

信创办公–基于WPS的Word最佳实践系列 (图文环绕方式)

信创办公–基于WPS的Word最佳实践系列 (图文环绕方式) 目录 应用背景操作步骤1、 打开布局选项中图文环绕方式的方法2、 图文环绕三大类型 应用背景 在Word中,对文字和图片进行排版时,采用各种不同的图片与文字组合效果能够使页面…

Python基础教程:装饰器的详细教程

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 一、什么是装饰器 目的:给func()方法,增加一个功能,在fun()执行期间,同时把fun()执行速率机算出来 import time def func():print(嘻嘻哈哈)start_time time.time() ti…

Windows版IntelliJ插件SmartInput使用入门

插件设置 CtrlAlts 打开Setting,可以找到SmartInput插件设置页面,也可以通过“右键 -> SmartInput -> 插件设置”快速进入。右键选项打开使用统计可以看到插件为您有效切换输入法的次数。如果您遇到了BUG,右键选项反馈错误日志并复制U…