多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 类加载机制 ## 类的生命周期 ![](https://img.kancloud.cn/e7/7c/e77c94884093de5ed80add9fba016160_1334x1580.png) ## 加载 ![](https://img.kancloud.cn/ae/7d/ae7dde46037a8e9083ef22bfcd8a23d9_962x892.png) ## 验证 文件格式验证,元数据验证(语义校验),字节码验证(逻辑校验),符号引用校验 ![](https://img.kancloud.cn/9b/04/9b0405fa4123ca68f119de3f0f4a80da_1236x724.png) ## 准备 为类变量(static的)分配内存并赋初始值。 ![](https://img.kancloud.cn/74/12/741218b305c5926f2212ed6c081ce3ec_1060x498.png) ## 解析 主要针对: * 类或接口:CONSTANT_Class_info * 字段:CONSTANT_Fieldref_info * 类方法:CONSTANT_Methodref_info * 接口方法:CONSTANT_InterfaceMethodref_info (以下3种,是JDK1.7新增的动态语言支持,后续介绍) * 方法类型:CONSTANT_MethodType_info * 方法句柄:CONSTANT_MethodHandle_info * 调用点限定符:CONSTANT_InvokeDynamic_info ![](https://img.kancloud.cn/c6/ed/c6ed780411c43bc91bc21930e85d140d_698x484.png) ## 初始化 ![](https://img.kancloud.cn/42/68/4268d22e33b874e0fc77e47799790ca7_602x328.png) ![](https://img.kancloud.cn/04/12/041280c062142b247986c357e56235fa_710x316.png) 测试: ~~~ /** * 死循环类 * @Author: mango * @Date: 2022/6/19 10:54 上午 */ public class DeadLoopClass { static { if(true){ System.out.println(Thread.currentThread() + " init DeadLoopClass"); while (true){ // 模拟长时间操作 } } } } ~~~ ~~~ /** * 类加载及初始化测试 * @Author: mango * @Date: 2022/6/19 10:58 上午 */ public class ClassInitTest { public static void main(String[] args) { Runnable runnable = new Runnable() { @Override public void run() { System.out.println(Thread.currentThread() + " start"); DeadLoopClass dlc = new DeadLoopClass(); System.out.println(Thread.currentThread() + " end"); } }; Thread t1 = new Thread(runnable); Thread t2 = new Thread(runnable); t1.start(); t2.start(); } } /** * 结果:第一个线程会卡主,其他线程阻塞 * Thread[Thread-0,5,main] start * Thread[Thread-1,5,main] start * Thread[Thread-0,5,main] init DeadLoopClass */ ~~~ ## 卸载 类卸载需要满足如下条件: * 该类所有的实例都已经被回收。 * 加载该类的ClassLoader已经被回收。 * 该类对应的java.lang.Class对象没有任何地方被引用。 ## 参考资料 * 周志明 * 《深入理解Java虚拟机》