-verbose:class 是最简单通用的JVM类加载日志开启方式,兼容所有主流JDK版本,输出已加载类的全限定名及来源路径,日志默认输出到stderr,可通过重定向保存为文件。

直接加 -verbose:class 参数就能开启 JVM 类加载日志,这是最简单、无需改代码的方式,适用于启动阶段快速观察类加载行为。
用 JVM 参数开启基础日志
在启动 Java 应用时加上这个参数即可:
java -verbose:class -jar myapp.jar- 输出示例:
[Loaded java.util.ArrayList from /modules]、[Loaded com.example.ServiceImpl from file:/app/lib/myapp.jar] - 日志默认输出到标准错误流(stderr),不经过 Logback 或 Log4j 等应用日志框架,所以不能按级别过滤或自动写入文件
- 如需保存日志,可用重定向:
java -verbose:class -jar myapp.jar > classload.log 2>&1 -
-XX:+TraceClassLoading功能与之高度相似,但-verbose:class兼容性更好,所有主流 JDK 版本都支持,推荐优先使用
运行时查看已加载类快照
当应用已在运行、无法重启时,可用以下命令获取当前类加载状态:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 先查进程 ID:
jps -l - 再执行:
jcmd <pid> VM.class_load_list—— 输出当前内存中所有已加载类的全限定名,不含路径和加载器细节 - 配合
Arthas sc命令可进一步查看详情:sc -d com.example.ServiceImpl能显示该类由哪个 ClassLoader 加载、来自哪个 JAR 或目录
精细控制日志内容(需编码)
若要记录加载时间、委托关系、异常堆栈等结构化信息,需自定义类加载器:
- 继承
URLClassLoader或ClassLoader,重写loadClass(String name, boolean resolve) - 开头记录类名和调用线程,结尾记录成功或抛出的异常
- 跳过系统类避免噪音:
if (!name.startsWith("java.") && !name.startsWith("javax.")) - 搭配 SLF4J 使用:
logger.debug("Loaded: {}, by: {}", name, this),便于后续按包名、加载器实例筛选分析
辅助分析类加载耗时与瓶颈
单看“是否加载”不够,有时需要判断“为什么慢”:
- 加
-XX:+TraceClassLoading和-XX:+TraceClassLoadingPreorder,观察加载顺序和时间点 - 加
-Dsun.misc.URLClassPath.debug=true查看 classpath 扫描过程,识别 jar 包过多导致的路径遍历延迟 - 结合 Spring Boot Actuator 的
/actuator/startup端点,对齐时间戳估算类加载在总启动耗时中的占比 - 同时开启 GC 日志(
-Xloggc:gc.log -XX:+PrintGCDetails),确认慢是真因还是 GC 停顿造成的假象

















