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快速定位是否有异常增多的对象(如大量未释放的StringList

二、内存泄漏排查(深入分析对象引用)

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频繁使用,需增加物理内存或减少其他进程占用
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐