jps查不到java进程主因是权限与hsperfdata目录隔离;jstat显示元空间持续增长表明类加载器泄漏;jmap-histo需关注bytes而非instances;jstack的blocked可能由synchronized与lock混用导致。

jps 查不到正在运行的 Java 进程?
常见现象是 jps 输出为空,或只显示自己(Jps),但明明有 Java 应用在跑。根本原因不是进程挂了,而是 jps 默认只查当前用户、且依赖 tmp 下的 hsperfdata 文件 —— 而很多容器化部署或以其他用户启动的 JVM 会禁用或隔离这个目录。
- 确认 JVM 启动时没加
-XX:+DisableAttachMechanism(加了就彻底禁用所有 jdk 工具 attach) - 检查
/tmp/hsperfdata_$USER/是否存在且可读;Docker 中常需挂载/tmp或改用-XX:+UsePerfData - 换用
jps -l(显示完整类路径)或jps -v(显示 JVM 参数),有时能绕过部分权限判断 - 实在不行,直接
ps aux | grep java找 pid,后续命令都支持传 pid
jstat 看 GC 频繁但堆内存不高?重点关注元空间和压缩类空间
jstat -gc <pid></pid> 显示 MC(Metaspace Capacity)、CCSC(Compressed Class Space Capacity)持续增长甚至 OOM,但 heap 使用率很低——这是典型的类加载器泄漏或动态字节码生成(如 CGLIB、Spring AOP、Groovy 脚本)导致的元空间耗尽。
- 用
jstat -gc <pid> 1000 5</pid>每秒刷新 5 次,观察MU(Metaspace Used)是否单向增长 - 对比
MC和MU:若MU接近MC且MGCMN/MGCMX(Metaspace GC 阈值)没自动调高,说明触发了 Metaspace GC 但没回收掉类 - 避免盲目加大
-XX:MaxMetaspaceSize,先用jmap -clstats <pid></pid>看哪些 classloader 加载了大量类
jmap -histo 不准?别信默认输出的“对象数”,看实际内存占用
jmap -histo <pid></pid> 默认按实例数量排序,但小对象(如 java.lang.Integer、byte[])数量多未必占内存;真正压垮堆的往往是少数大数组或缓存对象。更关键的是:jmap -histo 是“快照式”统计,不触发 Full GC,可能漏掉刚晋升到老年代但尚未被标记的对象。
- 加
-J-Xmx2g参数防止jmap自身 OOM(尤其大堆场景):jmap -J-Xmx2g -histo <pid></pid> - 用
jmap -histo:live <pid></pid>强制先做一次 CMS/Serial GC 再统计(注意:会 STW,生产慎用) - 关注
[B(byte[])、[C(char[])、java.util.HashMap$Node这三类 —— 它们通常对应缓存、JSON 解析、字符串拼接等真实内存大户 - 数字列第三列是“bytes”,比第一列“instances”更有参考价值
jstack 线程状态为 BLOCKED 却找不到锁持有者?检查 synchronized 与 Lock 混用
jstack <pid></pid> 输出里一堆线程卡在 java.lang.Thread.State: BLOCKED (on object monitor),但搜 locked 找不到对应地址的持有者 —— 很可能锁对象是动态生成的(如 String 常量池、Integer 缓存),或者用了 <code>java.util.concurrent.locks.ReentrantLock,而 jstack 对显式锁不显示持有关系。
立即学习“Java免费学习笔记(深入)”;
- 用
jstack -l <pid></pid>(带锁信息),它会额外打印- waiting to lock和- locked,但对ReentrantLock只显示parking to wait for - 如果看到
java.lang.Thread.State: WAITING (parking)+Unsafe.park,基本是LockSupport.park或ReentrantLock导致,得结合代码查lock()/tryLock()调用点 - 警惕
synchronized (someString):String 走常量池,不同模块可能意外锁同一对象
元空间泄漏和显式锁的排查,最容易被当成“GC 问题”或“死锁”绕过去,其实工具链本身就在提示你往哪挖 —— 关键是别只盯着 heap 和 deadlock 四个字。










