JVM类加载机制主线为“类的完整生命周期”七阶段:加载→验证→准备→解析→初始化→使用→卸载,其中前五阶段构成类加载流程,验证/准备/解析合称“链接”,解析可延迟;主动引用(如new、static调用等)必触发初始化,被动引用(如子类引用父类静态字段、数组定义、编译期常量)不触发;类加载器呈三层结构(Bootstrap→Extension→Application),遵循双亲委派模型,保障安全与唯一性;加载存元数据于方法区/元空间并生成Class对象,准备仅设static默认值,解析转符号引用为直接引用,初始化执行<clinit>赋值与静态块。

画JVM类加载机制的思维导图,关键不是堆砌所有概念,而是抓住主线逻辑和高频考点,让结构一眼看清“谁在什么时候做了什么”。下面分几个核心模块来组织,直接对应面试和理解重点:
一、生命周期主干:7阶段+5阶段重点
最外层主分支写“类的完整生命周期”,再展开7个阶段:加载→验证→准备→解析→初始化→使用→卸载。其中前5个是类加载流程(注意“加载”是起点,“初始化”是终点),后2个属于运行期行为,不参与加载过程。特别标注:验证、准备、解析统称“链接”阶段;解析可能延迟到初始化之后(比如动态语言支持场景)。
二、触发时机:主动引用 vs 被动引用
这是高频考点,建议用对比分支呈现:
- 主动引用(必触发初始化):new对象、访问/修改非final静态变量、调用静态方法、Class.forName()、子类初始化时父类未初始化、main方法所在类、MethodHandle调用静态方法
- 被动引用(不触发初始化):子类引用父类的静态字段(只初始化父类)、数组定义(如User[] arr)、常量在编译期就内联(如public static final int VAL = 1)
三、类加载器体系:三层结构+双亲委派
画成自上而下的树状结构:
- Bootstrap ClassLoader:C++实现,加载rt.jar等核心类(如java.lang.*),无父加载器
- Extension ClassLoader:加载jre/lib/ext下jar包,父为Bootstrap
- Application ClassLoader(System):加载-classpath路径,父为Extension
在旁边加注:双亲委派模型 = 先委托父类加载,父无法加载再自己尝试;好处是避免类重复加载、保障核心类安全;破坏场景包括SPI机制、热部署、OSGi等。
四、关键区域与数据结构
配合JVM内存模型简要关联:
- 加载阶段产出:方法区(或元空间)存类元数据、运行时常量池;堆中生成java.lang.Class对象
- 准备阶段重点:为static变量分配内存并设默认值(如int=0),不执行赋值语句
- 解析阶段本质:把符号引用(如类名、方法名)转为直接引用(内存地址)
- 初始化阶段动作:执行<clinit>方法,按代码顺序给static变量真正赋值、执行static块


















