类加载过程 - 图2

加载

其实就是找到字节流,然后将其加载到 JVM 中,生成类对象。这个阶段就是类加载器派上用场的阶段,等下我们再细说。

链接

这个阶段是要让生成的类对象融入到 JVM 中,分别要经历以下三个步骤:
image.png

验证

就是检验一下加载的类是否满足 JVM 的约束条件,也就是判断是否合规。

准备

就是为加载类的静态变量申请内存空间,并赋予初始值,例如是 int 类型那初始值就是 0。

解析

就是将符号引用解析成为实际引用,讲人话就是:例如 Yes 类里面引用了一个 XX 类,那一开始 Yes 类肯定不知道 XX 类在内存里面的地址,所以就先搞个符号引用替代一下,假装知道,等类加载解析的时候再找到 XX 类真正地址,做一个实际引用。
这就是解析要做的事情。还有一点,虽说把解析放到链接阶段里面,但是 JVM 规范并没有要求在链接过程中完成解析。

初始化

这个阶段就是为常量字段赋值,然后执行静态代码块,将一堆要执行的静态代码块方法包装成 clinit 方法执行,这个方法会加锁,由 JVM 来保证 clinit 方法只会被执行一次。
所以可以用一个内部静态类来实现延迟初始化的单例设计模式,同时保证了线程安全。
这个阶段完毕之后,类加载过程就 ok 了,可以投入使用啦,再来画个图汇总一下: