jps和jstat是排查Java内存泄漏第一步:jps定位进程PID,jstat监控堆内存变化;重点关注OU持续上涨、OU%>95%且GC后不回落、FGC频繁等指标。

排查Java内存泄漏,jps和jstat是第一步也是最关键的轻量级组合:jps快速定位目标进程,jstat实时观察堆内存行为。不依赖任何外部环境,所有JDK自带,线上可直接执行。
用 jps 快速找到要监控的 Java 进程
内存问题一定发生在某个具体进程上,jps就是找它的“身份证扫描仪”。运行后输出类似:
12345 com.example.Application
其中 12345 就是 PID,后续所有命令都基于它。常用技巧:
立即学习“Java免费学习笔记(深入)”;
-
jps -q:只显示纯数字PID,适合脚本取值 -
jps -l:显示主类全限定名,便于区分多个Spring Boot应用 - 如果进程没列出来,检查是否用非当前用户启动(加
-l参数有时需权限)
用 jstat 实时观察堆内存变化趋势
确认PID后,立刻用jstat看GC和堆使用是否异常。核心命令是:
jstat -gc 12345 1000 5
表示每秒采集一次GC数据,共5次。重点关注以下字段:
- OU(Old Used):老年代已用空间——持续上涨且GC后不回落,是泄漏最直接信号
- OGC(Old Capacity):老年代总容量——两者比值长期>90%,说明老年代快满了
- FGCT(Full GC Time) 和 FGC(Full GC Count):数值增长快、单次耗时>1s,说明GC压力大
- EU/EC(Eden区使用/容量):若Eden频繁回收但老年代仍涨,说明对象过早晋升或无法回收
更直观的方式是用 jstat -gcutil 12345 1000,它直接显示各区域使用率百分比,OU% > 95% 并连续上升,基本可锁定泄漏嫌疑。
结合看日志和业务节奏做交叉判断
jstat只是工具,关键在解读。避免把正常波动误判为泄漏:
- 刚启动或流量突增时,堆内存自然上升,等几分钟再看GC后能否回落
- 如果
OU每次Full GC后下降很少(比如只降10MB),而业务无大量新对象创建,大概率存在泄漏 - 配合
top -p 12345查看 RES(物理内存)是否同步上涨,能排除堆外内存干扰


















