🌟 背景介绍
在 Java 开发中,内存溢出(OutOfMemoryError) 是常见的运行时问题之一。为了快速定位原因,我们通常会配置 JVM 参数在发生 OOM 时自动生成堆转储文件(.hprof
),然后通过专业的工具进行分析。
本文将带你一步步使用 Eclipse MAT(Memory Analyzer) 和 VisualVM 来打开并分析由 Spring Boot 接口触发的 OOM 堆转储文件 heapdump.hprof
,帮助你掌握内存泄漏排查的核心技能!
🛠️ 实验环境准备
✅ 模拟 OOM 的接口代码:
@RestController
@RequestMapping("/oom")
@Api(tags = "模拟OOM控制类")
public class OOMController {
@ApiOperation(value = "OOM方法")
@GetMapping("/oom")
public String causeOOM() {
List<String> list = new ArrayList<>();
int i = 0;
try {
while (true) {
list.add("Memory Leak " + i++);
}
} catch (OutOfMemoryError e) {
return "OOM occurred!";
}
}
}
✅ 启动命令(用于快速触发 OOM 并生成 dump 文件)
java -Xms128m -Xmx128m \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=./heapdump.hprof \
-jar springboot-demo-1.0.0.jar
访问接口:
👉 http://localhost:8080/oom/oom
几秒钟后就会触发 OOM,并在当前目录下生成 heapdump.hprof
文件。
1.控制台截图:
2.hprof文件截图
📁 heapdump.hprof 文件说明
- 文件名:
heapdump.hprof
- 大小:约 173MB(根据实际堆大小不同)
- 触发原因:Java heap space(堆内存溢出)
- 存储路径:执行 jar 包所在目录
🔍 工具一:Eclipse MAT(Memory Analyzer)
📌 简介
Eclipse MAT 是一个强大的 Java 堆内存分析工具,能帮助开发者快速识别内存泄漏、大对象、GC Roots 等关键信息。
🧪 分析步骤:
- 下载地址:https://www.eclipse.org/mat/
- 安装完成后,打开 MAT,点击 Open a Heap Dump
- 选择你的
heapdump.hprof
文件 - 等待加载完成后,进入主界面
🔍 关键分析视图:
- Histogram:查看所有类的实例数量和占用内存
- Dominator Tree:找出哪些对象占用了最多内存
- Leak Suspects Report:自动分析可能的内存泄漏点
✨ 示例分析结果(截图说明):
1.选择 dominator tree模式
2.查看对象详情:
📊 工具二:VisualVM
📌 简介
VisualVM 是 JDK 自带的轻量级性能监控与分析工具,支持实时监控、线程分析、CPU/Memory Profiling、以及 heapdump 分析。
🧪 分析步骤:
- JDK 自带(路径:
$JAVA_HOME/bin/jvisualvm.exe
) - 打开 VisualVM,点击菜单栏 File -> Load
- 选择
heapdump.hprof
文件 - 加载完成后,切换到 Classes 或 Instances 标签页
🔍 关键分析视图:
- Classes:查看各类型实例数及内存占比
- GC Roots:追踪根对象引用链
- OQL 控制台:使用面向对象查询语句查找特定对象
✨ 示例分析结果(截图说明):
🧠 对比总结:Eclipse MAT vs VisualVM
特性 | Eclipse MAT | VisualVM |
---|---|---|
功能强大 | ✅ 强大且专业 | ⭕ 基础功能齐全 |
分析深度 | ✅ 支持多维分析(如支配树、泄漏报告) | ⭕ 适合初学者和日常诊断 |
使用难度 | ⭕ 需要一定经验 | ✅ 上手简单 |
内存泄漏检测 | ✅ 自动识别可疑泄漏点 | ⭕ 手动分析为主 |
是否免费 | ✅ 免费开源 | ✅ 免费自带 |
💡 小贴士:如何避免此类 OOM?
- 避免无限制增长的数据结构:如无限添加元素的 List、Map。
- 合理设置 JVM 堆大小:生产环境中应根据负载调整
-Xmx
。 - 使用弱引用(WeakHashMap):适用于缓存等场景。
- 使用内存分析工具定期检查内存使用情况。
📢 结语
通过本篇文章的学习,你应该已经掌握了如何通过 Spring Boot 接口触发 OOM、生成 heapdump 文件,并使用 Eclipse MAT 和 VisualVM 进行深入分析 的完整流程。
内存泄漏不可怕,只要你会看 “内存快照”,就能一眼识破问题根源!
📌 欢迎收藏、点赞、评论,也欢迎关注我的 CSDN 主页获取更多 Java 性能调优实战技巧!