推荐命令是jcmd <pid> VM.classloader -all(JDK 9+),可一步输出所有已加载类及其类加载器;JDK 8需用jmap -clstats或jmap -dump配合工具,无法单命令实现。

可以使用 jcmd 配合 jhsdb 或直接用 jmap(JDK 8+ 推荐 jcmd)实现,但最简洁、无需额外参数且兼容性好的方式是:
用 jcmd + VM.native_memory(不适用)→ 改用 jcmd + VM.class_hierarchy(错误)→ 正确方案:jcmd + VM.system_properties 不行 → 实际有效命令是:
jcmd <pid> VM.class_hierarchy 并不能打印所有已加载类;真正能一步完成目标的是:
推荐命令(JDK 8u60+ / JDK 9+):
jcmd $(jps | grep -v Jps | head -n1 | awk '{print $1}') VM.classloader -all
说明:
-
jps列出本地 JVM 进程,grep -v Jps排除 jps 自身,head -n1取第一个(通常是你关注的主应用),awk '{print $1}'提取 PID -
jcmd <pid> VM.classloader -all是 JDK 9+ 引入的内置指令,会输出每个已加载类的全限定名(如java.lang.String)及其对应的类加载器实例(如sun.misc.Launcher$AppClassLoader@18b4aac2) - 该命令在 JDK 8 中不可用;若必须用 JDK 8,需改用
jmap -clstats <pid>(仅显示加载器统计,不含逐个类名),或结合jmap -dump+ 三方工具解析,无法单命令完成
替代方案(JDK 8 兼容,需额外工具):
若环境受限于 JDK 8 且无法升级,没有真正“一条命令”可直接打印「类名 + 加载器」,但可近似实现:
-
jmap -histo:live <pid> | head -20:只列类名和实例数,无加载器信息 -
jmap -dump:format=b,file=heap.hprof <pid>后用jhat或 Eclipse MAT 分析 —— 不是一条命令,也不适合脚本化 - 使用
jdk.jfr+ 自定义事件需提前开启飞行记录,不满足“即时查看”需求
验证是否生效的小技巧:
- 先用
jps -l确认目标进程 PID 和主类名 - 运行命令后,检查输出中是否包含类似:
java.util.ArrayList <bootstrap>com.example.MyService sun.misc.Launcher$AppClassLoader@7a5d0123 -
<bootstrap>表示由启动类加载器加载;其他为具体 ClassLoader 实例地址
注意:执行命令的用户需与目标 JVM 进程属同一用户(Linux/macOS),否则权限拒绝;Windows 下一般无此限制。


















