定位 Java 内存问题是性能调优和故障排查中的常见任务,通常可以从现象观察 → 工具分析 → 代码定位 → 验证修复四个阶段来进行。下面给你一套比较系统和实用的思路。
Java 内存问题通常分为几类:
内存泄漏(Memory Leak)
OutOfMemoryError: Java heap space内存溢出(OOM)
GC 性能问题
非堆内存问题
jstat -gcutil <pid> 1000
关注:
OU(老年代使用率)FGC / FGCT(Full GC 次数和时间)O 是否持续上涨不回落jinfo <pid>
确认:
-Xms / -Xmx-XX:MetaspaceSize-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/path/to/dump.hprof
jmap -dump:live,format=b,file=heap.hprof <pid>
重点看:
static Map<String, Object> cache = new HashMap<>();
→ 只加不删
监听器 / 回调未注销
缓存无限增长
threadLocal.set(obj);
// 忘记 remove
→ 线程池场景下极易泄漏
OutOfMemoryError: Metaspace
原因:
工具:
jstat -class <pid>
-XX:MaxDirectMemorySize
常见于:
ByteBufferjmap -histo:live <pid>
jstack <pid>
dashboard
heapdump
watch / trace
开启:
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:gc.log
分析工具:
看:
jstat 和 GC 日志如果你愿意,可以告诉我:
我可以帮你做更针对性的分析。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。