类加载机制是 JVM 中最容易被"背八股文"却最难真正吃透的一块。很多人能脱口而出"双亲委派模型"六个字,却说不清 ClassLoader.loadClass 和 Class.forName 的初始化时机差异,也解释不了 SPI 为什么要打破双亲委派、以及 Tomcat 为什么每个 Web 应用都要有独立的 ClassLoader。本文从字节码加载的完整生命周期出发,结合生产环境的真实踩坑,把这一机制讲透。
一、类从字节码到实例:五个阶段的完整链路
一个 .class 文件从磁盘到真正可用,要经历加载(Loading)→ 验证(Verification)→ 准备(Preparation)→ 解析(Resolution)→ 初始化(Initialization)五个阶段。前三个阶段通常被笼统称为"加载",但实际上语义完全不同,很多线上问题的根源就是混淆了这些阶段。
2022/12/17大约 9 分钟