JDK 官方不提供 jsh 命令;可通过 jcmd VM.flags 查看显式 GC 参数,jstat -gc 观察列名判断实际运行的垃圾收集器类型,并结合 JMX 或系统属性确认。

Java 中没有 jsh 命令,也不存在标准 JDK 自带的 jsh 工具。你提到的 jsh 很可能是混淆了其他工具(比如早期实验性的 jshell,或某些第三方/定制化运维脚本),但 **JDK 官方工具链中不提供 jsh**。
不过,你可以完全使用 jcmd(JDK 7u4+ 内置)配合 jstat 或 JVM 系统属性,**动态、在线、无需重启**地查询当前 JVM 进程使用的垃圾收集器。以下是准确、实用的方法:
✅ 使用 jcmd 查询 JVM 启动参数(含 -XX:+UseXXXGC)
jcmd 可以打印目标 JVM 的完整启动命令行,其中明确包含用户显式指定的 GC 相关 JVM 参数(如 -XX:+UseG1GC、-XX:+UseParallelGC 等):
- 列出所有 Java 进程:
jcmd -l - 查看某进程的 VM 参数(含 GC 设置):
jcmd <pid> VM.native_memory summary不适用;正确命令是:jcmd <pid> VM.flags - 输出中搜索
Use或GC关键字,例如:
-XX:+UseG1GC、-XX:+UseParallelGC、-XX:+UseZGC
✅ 使用 jstat 实时验证实际生效的 GC 类型
jstat 能读取 JVM 运行时的 GC 统计,其输出列名本身隐含 GC 类型(不同 GC 对应不同列组合),是最可靠的“运行时确认”方式:
立即学习“Java免费学习笔记(深入)”;
- 执行:
jstat -gc <pid> - 观察列名判断 GC:
- 含
OU(Old Used)、OC(Old Capacity)、YGC(Young GC 次数)、FGC(Full GC 次数)→ 多为 Parallel / Serial GC - 含
MU(Metaspace Used)、MC(Metaspace Capacity)、CCSU(Compressed Class Space Used)→ 表明使用 G1 或 ZGC(JDK 8u20+ / JDK 11+) - 含
EU(Eden Used)、SU(Survivor Used)、GU(G1 Eden Used)、GCT(GC Time)→ 强烈提示 G1GC - ZGC 会显示
ZGCCurrent、ZGCLive等列(需 JDK 11+ 并启用-XX:+PrintGCDetails配合日志更准)
- 含
✅ 通过 JMX 或运行时系统属性辅助确认
如果应用支持 JMX(默认开启),可用 jconsole 或 jvisualvm 连接后查看:
「VM Summary」→ 「Garbage Collectors」列表,直接显示所有已注册的 GC 名称(如 G1 Young Generation, G1 Old Generation)。
或在代码中调用:java.lang.management.GarbageCollectorMXBean 获取名称(如 "G1 Young Generation"),也可通过 jcmd <pid> VM.system_properties | grep java.version 辅助判断 JDK 版本对 GC 的支持范围。
⚠️ 注意事项
- JDK 版本决定可用 GC:JDK 8 默认 Parallel,JDK 9+ 默认 G1,JDK 11+ 支持 ZGC(实验性),JDK 15+ 支持 Shenandoah(Linux)
- 未显式指定 GC 时,JVM 根据机器配置(CPU/内存)自动选择,
jcmd <pid> VM.flags中若无UseXXXGC,说明用的是默认策略 -
jcmd和jstat均要求执行用户与目标 JVM 进程属同一 OS 用户(或 root),否则权限拒绝


















