最常用的是-verbose:class和-XX:+TraceClassLoading;前者通用稳定、输出类名及来源路径,后者为HotSpot专属、部分场景显示加载器类型,JDK 9+需配合--add-opens等参数辅助分析模块化场景。

在 Java 中,可以通过 JVM 启动参数启用类加载的详细日志输出,最常用的是 -verbose:class 和更精细的 -XX:+TraceClassLoading(或其增强版 -XX:+TraceClassLoadingPreorder)。
使用 -verbose:class 查看基础类加载信息
这是最简单直接的方式,JVM 会在控制台打印每个被加载的类名及其来源(如 JAR 路径或模块):
- 启动命令示例:java -verbose:class MyApp
- 输出类似:[Loaded java.lang.Object from /jdk/lib/modules]
- 适合快速确认某个类是否被加载、加载顺序、以及是否来自预期位置
用 -XX:+TraceClassLoading 获取更详细的加载上下文
该参数与 -verbose:class 功能基本一致,但属于 HotSpot 专属诊断选项,部分 JDK 版本中输出更稳定:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 命令示例:java -XX:+TraceClassLoading MyApp
- 输出格式与 -verbose:class 相同,但某些场景下会额外显示加载器类型(如 BootstrapClassLoader、AppClassLoader)
- 注意:JDK 9+ 模块系统启用后,部分系统类可能不显式打印,可配合 --add-opens 或 --show-module-resolution 辅助分析
定位类加载冲突或双亲委派异常时的进阶技巧
当遇到 NoClassDefFoundError、ClassNotFoundException 或重复加载问题,建议组合使用以下参数:
- -XX:+TraceClassLoadingPreorder:按实际加载顺序(含隐式依赖)输出,能反映类初始化触发的级联加载
- -XX:+PrintClassHistogram(需配合 Ctrl+Break 或 jcmd 触发):查看当前已加载类的统计快照
- -Dsun.misc.URLClassPath.debug=true:调试自定义 ClassLoader 的 URL 路径搜索过程(对 Spring Boot 等嵌套 JAR 场景有用)
- 结合 jcmd
VM.native_memory summary 可辅助判断是否因元空间(Metaspace)不足导致加载失败
注意事项和常见误区
这些日志会产生大量输出,尤其在应用启动阶段。生产环境慎用,开发/测试阶段建议重定向到文件:
- 命令示例:java -verbose:class MyApp > classload.log 2>&1
- JDK 17+ 默认开启 ZGC 或 Shenandoah 时,-verbose:class 仍完全可用,不受垃圾收集器影响
- -XX:+TraceClassUnloading 可配合使用,观察类卸载行为(需启用 CMS 或 G1 的类卸载支持,如 -XX:+UseG1GC -XX:+G1EnableStringDeduplication)
- 若使用模块化(module-info.java),还需关注 --show-module-resolution 输出,它会显示模块间 requires/provides 解析过程
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










