下面从思路 + 常用工具 + 实战排查步骤三个层面,系统讲一下 Java 内存问题如何排查。内容偏实战,适合线上问题定位。
内存泄漏(Memory Leak)
内存溢出(OOM)
Java heap spaceMetaspaceDirect buffer memoryGC 问题(不是泄漏,但表现像)
先看现象:
java.lang.OutOfMemoryError
✅ 如果 CPU 高 + Full GC 多 → 大概率是内存或 GC 问题
jmap -heap <pid>
关注:
jmap -dump:live,format=b,file=heap.hprof <pid>
live表示只 dump 存活对象,体积更小
如果是生产环境,建议:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/logs/
| 工具 | 说明 |
|---|---|
| MAT(Eclipse Memory Analyzer) | ✅ 最常用 |
| VisualVM | 简单直观 |
| JProfiler | 商业、功能强 |
| YourKit | 商业 |
打开 heap.hprof 后看:
Histogram
Dominator Tree
Path To GC Roots
✅ 80% 的内存泄漏都能在这里找到
-Xlog:gc*:file=gc.log:time,uptime,level,tags
或(旧版本):
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:gc.log
常见内存泄漏代码模式:
static Map<String, Object> cache = new HashMap<>();
✅ 解决:
ThreadLocal<Object> tl = new ThreadLocal<>();
在线程池中一定要:
tl.remove();
✅ 重点:
✅ 重点:
✅ 重点:
-XX:MaxDirectMemorySizetop -Hp <pid> → 发现 GC 线程 CPU 高jstat -gcutil <pid> 1000 → Old Gen 满jmap -dumpList 有 300 万个对象-Xms4g
-Xmx4g
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/logs/
-Xlog:gc*:file=/data/logs/gc.log
Java 内存排查 = 监控 → 堆快照 → MAT → 代码
如果你愿意,可以告诉我:
我可以给你一个更针对性的排查方案,甚至帮你“看堆快照思路”。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。