java内存问题排查
jps。
·
Linux环境下Java项目内存排查命令
一、JVM内存状态查看(快速定位整体情况)
1. jps:查看Java进程ID
jps -l # 显示进程ID和完整类名(或jar包路径)
# 示例输出:
# 12345 /opt/app/myapp.jar # 进程ID为12345的Java应用
用途:快速获取目标Java进程的PID,为后续命令提供参数。
2. jstat:监控JVM内存和GC状态
# 查看堆内存使用情况(每隔1秒输出1次,共输出5次)
jstat -gc 12345 1000 5
输出参数说明:
- S0C/S1C:Survivor0/1区容量(KB)
- S0U/S1U:Survivor0/1区已使用(KB)
- EC/EU:Eden区容量/已使用
- OC/OU:老年代容量/已使用
- MC/MU:元空间(Metaspace)容量/已使用
- YGC/YGCT:年轻代GC次数/耗时(秒)
- FGC/FGCT:Full GC次数/耗时(秒)
关键指标:
- 若
OU(老年代已使用)持续接近OC(老年代容量),可能触发频繁Full GC FGC次数频繁(如每分钟多次),需排查内存泄漏或老年代设置过小
3. jmap:生成堆内存快照(分析对象分布)
# 生成堆快照(.hprof文件)
jmap -dump:format=b,file=heap_dump.hprof 12345
# 查看堆中对象数量和大小(按实例数排序)
jmap -histo 12345 | head -20 # 显示前20行
用途:
heap_dump.hprof可导入MAT(Eclipse Memory Analyzer)工具分析内存泄漏jmap -histo快速定位是否有异常增多的对象(如大量未释放的String、List)
二、内存泄漏排查(深入分析对象引用)
1. jhat:分析堆快照(简易工具)
jhat -port 8080 heap_dump.hprof # 在8080端口启动Web服务
访问http://localhost:8080,通过以下功能分析:
- Show heap histogram:查看对象分布
- Find object by id:跟踪对象引用链
- Show instances by class:查看指定类的所有实例
2. 结合grep定位异常类
# 从堆快照统计中筛选特定类(如com.example.User)
jmap -histo 12345 | grep "com.example.User"
说明:若某个业务类实例数异常多(如几十万),可能存在未释放的缓存或集合引用
三、系统级内存监控(查看整体资源占用)
1. top:实时监控进程内存占用
top -p 12345 # 仅监控PID为12345的进程
关键指标:
RES:进程实际使用的物理内存(KB)%MEM:进程占用内存百分比- 若
RES持续增长且不释放,可能存在内存泄漏
2. free:查看系统整体内存
free -h # 以人类可读格式显示
# 输出示例:
# total used free shared buff/cache available
# Mem: 15G 8.5G 2.3G 128M 4.2G 6.5G
用途:判断是否因系统内存不足(如available接近0)导致JVM频繁GC
3. vmstat:监控内存交换(Swap)
vmstat 1 # 每隔1秒输出1次系统状态
关键指标:
si(每秒从Swap读入内存的数据量)和so(每秒写入Swap的数据量)若持续大于0,说明内存不足,JVM性能会急剧下降
四、GC日志分析(定位GC异常)
1. 开启GC日志(需在JVM启动参数中配置)
# 在启动脚本中添加(以Java 8为例)
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/opt/logs/gc.log
2. 分析GC日志
# 查看GC日志中Full GC的次数
grep "Full GC" /opt/logs/gc.log | wc -l
# 提取每次Full GC耗时
grep "Full GC" /opt/logs/gc.log | grep -oP '(\d+\.\d+) secs'
判断标准:
- 正常应用Full GC应几分钟甚至几小时一次,每次耗时不超过1秒
- 若频繁Full GC且耗时过长,需优化内存配置或代码
五、常见问题处理流程
1. 内存溢出(OOM)
- 执行
jmap -dump:format=b,file=oom.hprof 12345生成快照 - 用MAT工具分析快照,查看
Dominator Tree定位大对象
2. 频繁GC
- 用
jstat -gc 12345 1000观察YGC/FGC频率 - 检查JVM参数(如
-Xms、-Xmx、-XX:NewRatio)是否合理,可适当调大堆内存
3. 系统内存不足
- 用
free -h确认系统内存 - 若Swap频繁使用,需增加物理内存或减少其他进程占用
更多推荐

所有评论(0)