Troubleshooting系列-MAT使用介绍以实战

Eclipse Memory Analyzer(简称MAT)是一个强大的Java堆内存分析工具,用于帮助开发人员识别和解决Java应用程序中的内存泄漏和内存占用问题。

安装以及堆获取

MAT安装可在ecplise官网上获取,链接如下:archive.eclipse.org/mat/1.8/rcp...

主要注意修改MemoryAnalyzer.ini,可以将xmx稍微改大一些

diff 复制代码
-startup
plugins/org.eclipse.equinox.launcher_1.5.0.v20180512-1130.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.700.v20180518-1200
-vmargs
-Xmx2048m

堆获取方式参考之前博客:Troubleshooting系列-JAVA虚拟机命令总结

MAT相关概念

打开dump文件如下

MAT 计算对象占据内存的两种方式

  • Shallow heap:指的是对象自身所占据的内存
  • Retained heap:指的是当对象不再被引用时,垃圾回收器所能回收的总内存,包括对象自身所占据的内存,以及仅能够通过该对象引用到的其他对象所占据的内存

Leak Suspects

识别潜在的内存泄漏问题,并提供相关的详细信息和建议。

上面内存泄露怀疑点是caffeine相关的 Leak Suspects

com.github.benmanes.caffeine.cache.SIMS

sun.misc.Launcher$AppClassLoader @ 0xe0020830

Histogram

直方图:显示了各个类的内存占用情况,按照对象的数量或大小进行排序

相较于 jmap 的-histo 命令,MAT 工具更加强大,除了能够展示各个类的实例数目以及这些实例的 Shallow heap 总和,还可以计算 Retained heap,并支持基于实例数目或 Retained heap 的排序方式(默认为 Shallow heap)。此外,MAT 还可以将直方图中的类按照超类、类加载器或者包名分组。

对象引用关系

  • with incoming references 表示的是当前查看的对象,被外部应用
  • with outGoing references 表示的是当前对象,引用了外部对象

dominator tree

支配树的概念源自图论。在一则流图(flow diagram)中,如果从入口节点到 b 节点的所有路径都要经过 a 节点,那么 a 支配(dominate)b。在 a 支配 b,且 a 不同于 b 的情况下(即 a 严格支配 b),如果从 a 节点到 b 节点的所有路径中不存在支配 b 的其他节点,那么 a 直接支配(immediate dominate)b。这里的支配树指的便是由节点的直接支配节点所组成的树状结构。

MAT 将按照每个对象 Retained heap 的大小排列该支配树。如下图所示:

实战分析

基于之前sharding jdbc频繁fullgc分析,原文:Troubleshooting系列-shardingjdbc频繁fullgc问题分析及解决

通过内存泄露分析和支配图,很容易看出问题

最终发现是com.github.benmanes.caffeine.cache.BoundedLocalCache$BoundedLocalLoadingCache 引用的com.github.benmanes.caffeine.cache.SIMS过大导致的,下一步就是需要看代码分析和解决了。

参考

JVM系列之:MAT工具使用教程

相关推荐
budingxiaomoli4 小时前
Spring IoC &DI
java·spring·ioc·di
Spider Cat 蜘蛛猫4 小时前
Springboot SSO系统设计文档
java·spring boot·后端
未若君雅裁4 小时前
MySQL高可用与扩展-主从复制读写分离分库分表
java·数据库·mysql
学习中.........4 小时前
从扰动函数的变化,感受红黑树带来的性能提升
java
计算机安禾5 小时前
【c++面向对象编程】第24篇:类型转换运算符:自定义隐式转换与explicit
java·c++·算法
zyk_computer6 小时前
AI 时代,或许 Rust 比 Python 更合适
人工智能·后端·python·ai·rust·ai编程·vibe coding
weixin199701080166 小时前
【保姆级教程】淘宝/天猫商品详情 API(item_get)接入指南:Python/Java/PHP 调用示例与 JSON 返回值解析
java·python·php
无心水6 小时前
【Hermes:进阶调优与性能优化】45、性能调优:降低延迟与 token 消耗的 7 个技巧 —— 让 Hermes 智能体跑得更快、花得更少
网络·性能优化·mcp协议·openclaw·养龙虾·hermes·honcho
环流_6 小时前
redis核心数据类型在java中的操作
java·数据库·redis
雨辰AI6 小时前
SpringBoot3 项目国产化改造完整流程|从 MySQL 到人大金仓落地
java·数据库·后端·mysql·政务