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

java内存性能优化工具Mat

1.MAT(Memory Analyzer Tool)工具是一款功能强大的]ava堆内存分析器。可以用于查找内存泄漏以及查看内存消耗情况。MAT是基于Eclipse开发的,不仅可以单独使用,还可以作为插件的形式嵌入在Eclipse中使用。是一款免费的性能分析工具,使用起来非常方便。

2.下载地址

https://eclipse.dev/mat/download/

我这边电脑的系统是window系统,jdk版本是1.8,下载时应选择对应的版本下载

3.安装

双击启动MemoryAnalyzer.exe启动

如果启动报错,出现Incompatible JVM 弹窗时,下载弹窗中指定的jdk版本,不需要安装解压后在MemoryAnalyzer.ini 中通过加入以下内容加入指定jdk的地址

-vm
D:/java/jdk1.8.0_211/bin/javaw.exe  

4.使用

点击左上角file,选择所要打开的分析文件

如果堆dump文件较大、使用MAT打开的时候总是抛出 Java Heap Error

解决办法:
找到MAT的安装目录,找到MemoryAnalyzer.ini 修改其中的-Xmx即可

5.获取dump文件

通过top -c(然后按Shift+M按内存排序)命令找到占用内存大的java进程,通过以下命令生成dump文件

  • jmap -dump:format=b,file=oom.hprof 进程ID

通常情况下,在生产环境中使用jmap命令生成Heap dump文件时,建议把生成的文件下载到本地进行分析,以减少对生产环境的干扰。另外,在生成Heap dump文件时,一定要确保Java应用程序正常运行,否则可能会导致生成的文件不完整或者无法正确解析。

二、MAT工具排查分析

1.使用MAT定位问题

定位问题方式一:

现在有一个OOM后得到的堆转储文件 oom.hprof,现在要使用 MAT 的直方图支配树线程栈OQL 等功能来分析此次 OOM 的原因。

首先,用 MAT 打开后先进入的是概览信息界面,可以看到整个堆是 51MB:

那么,这 51MB 都是什么对象呢?

如图所示,工具栏的第二个按钮可以打开直方图,直方图按照类型进行分组,列出了每个类有多少个实例,以及占用的内存。可以看到,char[]字节数组占用内存最多,对象数量也很多,结合第二位的 byte[] 字节数组数量也很多,大概可以猜出程序可能是char[]和byte[]作为实际数据存储占满了内存,导致 OOM。

在 char[]上点击右键,选择 List objects->with incoming references,就可以列出所有的 char[]实例,以及每个 char[]的整个引用关系链:

  • Shallow Heap(浅堆)指对象自身占用内存的大小,包括对象头和成员变量(但不包括成员变量的值)
  • Retained Heap(深堆/保留堆)指对象被回收后,所有因引用关系被释放的对象所占内存总和。

找到Shallow Heap占用最大的一个 char[]展开,如下图所示:

可以大概知道我这个项目中write占用过多的内存,但是还是不能具体到那个具体的程序。

定位问题2:

点击工具栏中第三个按钮(下图左上角的红框所示)进入支配树界面。这个界面会按照对象的 Retained Heap 倒序直接列出占用内存最大的对象。

从上面的具体信息中可以看到序列化,缓存,数据库初始化所占用的内存较大,但是还是不能定位到具体的程序。

定位问题3:

点击工具栏的第五个按钮(下图红色框所示)。打开线程视图

通过以上信息可以看出我的程序中产生了很多定时程序的线程,从而占用了大量内存。

然后可以通过搜索查看引用的对象

点击工具栏的第四个按钮(如下图红框所示),来到 OQL 界面。在这个界面,我们可以使用类似 SQL 的语法,在 dump 中搜索数据(你可以直接在 MAT 帮助菜单搜索 OQL Syntax,来查看 OQL 的详细语法)。

sql:

  • select * from org.apache.tomcat.util.threads.TaskThread

点击下图中红色叹号按钮,运行上记sql,查找对象

定位问题4:

点击工具栏的第一个按钮(如下图红框所示),进入Leak Suspects界面

Leak Suspects 是 Eclipse Memory Analyzer (MAT) 工具的核心功能之一,用于快速定位 Java 堆转储文件中的内存泄漏嫌疑对象。

点击Details,查看详情

通过上述信息可以看出我的项目中定时任务占用了大量内存

通过查找代码,发现我启动了很多的定时任务

通过分析优化掉不需要的定时任务,可以释放一些内存。

http://www.dtcms.com/a/494881.html

相关文章:

  • React 18.x 学习计划 - 第四天:React Hooks深入
  • 地学考研专业选择学科地理、人文地理,还是GIS?不想考数学怎么选?
  • React 2025 完全指南:核心原理、实战技巧与性能优化
  • 大数据平台建站重庆网站制作团队
  • Linux CentOS 7 安装配置HAProxy完整指南:实现高可用负载均衡
  • 【小白笔记】PyTorch 和 Python 基础的这些问题
  • linux学习笔记(35)C语言连接mysql
  • 消息推送策略:如何在营销与用户体验间找到最佳平衡点
  • go资深之路笔记(九)kafka浅析
  • Java String 性能优化与内存管理:现代开发实战指南
  • 【软考备考】 NoSQL数据库有哪些,键值型、文档型、列族型、图数据库的特点与适用场景
  • 论《素数的几种筛法》
  • html静态页面怎么放在网站上原平的旅游网站怎么做的
  • 网页设计与网站建设作业公众号小程序制作步骤
  • 律师怎么做网站简单大气网站模板
  • 偏振相机在半导体制造的领域的应用
  • Uniapp微信小程序开发:EF Core 中级联删除
  • Java从入门到精通 - 集合框架(二)
  • 3proxy保姆级教程:WIN连接远端HTTPS代理
  • 大厂AI各走“开源”路
  • 室内装修效果图网站有哪些百度网盟推广是什么
  • grootN1 grootN1.5 gr00t安装方法以及使用(学习)
  • Typora(跨平台MarkDown编辑器) v1.12.2 中文绿色版
  • Unity开发抖音小游戏的震动
  • 团队作业——概要设计和数据库设计
  • 在Spring Boot开发中,HEAD、OPTIONS和 TRACE这些HTTP方法各有其特定的应用场景和实现方式
  • Flink DataStream「全分区窗口处理」mapPartition / sortPartition / aggregate / reduce
  • 网站备案号码查询大连网页设计哪家好
  • Next.js 入门指南
  • arcgis api for javascript 修改地图图层要素默认的高亮效果