java内存过高需先区分堆内/堆外、泄漏/配置问题:用top/ps/pmap查系统级内存分布,jstat/jmap分析堆状态,jmap dump+eclipse mat定位泄漏,jstack/jcmd排查线程与堆外内存。

Java进程内存占用过高,得先分清是堆内还是堆外、是泄漏还是配置不当,再按步骤查。
看系统级内存分布
用基础命令快速确认问题范围:
- top -c 或 htop:看 RES(实际物理内存)是否远超 -Xmx 设置值,若明显偏高,说明可能有堆外内存增长
- ps -eo pid,ppid,cmd,%mem,rss --sort=-rss | head -10:定位内存占用最高的 Java 进程及其 RSS 值
-
pmap -x
:查看进程各内存段(heap、anon、mapped、JIT code 等)分布,重点观察 anon 区是否异常膨胀
查 JVM 堆内存状态
聚焦堆内行为,判断是否 GC 失效或对象堆积:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
jstat -gc
1000 5 :观察 Old 区使用率是否持续上升、Full GC 是否频繁但回收量少 -
jmap -heap
:确认 -Xms/-Xmx 实际生效值,以及各代当前使用占比 -
jmap -histo:live
| head -20 :列出存活对象 Top20,重点关注 byte[]、String、HashMap$Node、ArrayList 等高频类是否数量/大小异常
抓堆转储分析泄漏点
当怀疑内存泄漏时,需获取快照深入分析:
- 用 jmap -dump:format=b,file=heap.hprof
主动导出(避免 OOM 后文件不全) - 用 Eclipse MAT 打开后查看:Histogram(找对象数量/大小异常类)、Dominator Tree(看谁持有了大量对象)、Leak Suspects(自动生成可疑报告)
- 典型泄漏线索:静态 Map 持有业务对象未清理、ThreadLocal 存储大对象未 remove、监听器注册后未注销、缓存无过期或淘汰策略
检查线程与本地内存
某些高内存场景和线程行为或直接内存相关:
-
jstack
> thread.log :结合 jstat 判断是否存在线程阻塞、死锁,或大量线程处于 RUNNABLE 却在做密集对象分配 -
jcmd
VM.native_memory summary scale=MB :开启 NMT(Native Memory Tracking)后可查 DirectByteBuffer、CodeCache、Metaspace 等堆外内存使用情况 - 若 Metaspace 持续增长,加 -XX:MaxMetaspaceSize=256m 限制;若 DirectMemory 异常,检查是否滥用 ByteBuffer.allocateDirect()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










