监控JVM类加载需同时采集三个变量:getLoadedClassCount()(当前存活类数)、getTotalLoadedClassCount()(累计加载总数)、getUnloadedClassCount()(累计卸载总数),三者满足恒等式且共同反映类生命周期状态与潜在泄漏风险。

要通过 ManagementFactory.getClassLoadingMXBean() 监控 JVM 中类的总数,关键不是只看一个数,而是理解三个核心指标之间的关系和变化趋势:当前加载数、累计加载数、累计卸载数。
监控哪几个变量?
ClassLoadingMXBean 提供三个直接反映类生命周期状态的数值:
- getLoadedClassCount():当前仍在 JVM 中存活的类数量(即已加载且未被卸载)
- getTotalLoadedClassCount():JVM 启动以来所有成功加载过的类总数(含后续又被卸载的)
- getUnloadedClassCount():JVM 启动以来所有被成功卸载的类总数
三者满足恒等式:getLoadedClassCount() == getTotalLoadedClassCount() - getUnloadedClassCount()。这个关系可用于校验数据一致性。
为什么只看 loaded class count 不够?
仅关注 getLoadedClassCount() 容易误判问题。例如:
- 该值长期缓慢上升,可能是正常业务增长,也可能是类加载器泄漏(如热部署未清理旧 ClassLoader)
- 该值突然归零或骤降,往往意味着发生了 Full GC + 类卸载(需开启
-XX:+CMSClassUnloadingEnabled或使用 G1/ZGC 的对应选项) - 而
getTotalLoadedClassCount()持续单向增长,结合getUnloadedClassCount()几乎不增加,才更可能指向类加载泄漏
如何在代码中安全采集?
获取实例无需额外配置,直接调用即可,但要注意线程安全和空值处理:
- ClassLoadingMXBean 是 JVM 平台级单例,
ManagementFactory.getClassLoadingMXBean()总是返回非 null 实例(Java 5+) - 建议封装为定期采样逻辑,例如每 30 秒记录一次三组数值,写入日志或指标系统
- 若需开启类加载详细日志辅助分析,可调用
setVerbose(true),但生产环境慎用(有性能开销)
配合 JMX 工具验证更直观
除了代码采集,还可通过标准工具实时观察:
- 启动应用时添加参数:
-Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false - 运行
jconsole→ 连接本地进程 → 切换到 MBeans 标签页 → 展开java.lang → ClassLoading - 右侧属性页中可实时刷新查看
LoadedClassCount、TotalLoadedClassCount、UnloadedClassCount和Verbose状态


















