# 类加载机制
## 类的生命周期
![](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虚拟机》
- 面试突击
- Java虚拟机
- 认识字节码
- 000Java发展历史
- 000Macos10.15.7上编译OpenJDK8u
- 001熟悉Java内存区域
- 002熟悉HotSpot中的对象
- 003Java如何计算对象大小
- 004垃圾判定算法与4大引用
- 005回收堆和方法区中对象
- 006垃圾收集算法
- 007HotSpot虚拟机垃圾算法实现篇1
- 007HotSpot虚拟机垃圾算法实现篇2
- 007HotSpot虚拟机垃圾算法实现篇3
- 008垃圾收集器
- 009内存分配与回收策略
- 010Java虚拟机相关工具
- 011调优案例分析
- 012一次IDEA的启动速度调优
- 013类文件Class的结构
- 014熟悉字节码指令
- 015类加载机制(过程)
- 016类加载器
- IDEA的JVM参数
- Java基础
- Java自动装箱与拆箱
- Java基础数据类型
- Java方法的参数传递
- Java并发
- 001走入并行的世界
- 002并行程序基础
- 003熟悉Java内存模型JMM
- 004Java并发之volatile关键字
- 005线程池入门到精通
- 006Java多线程间的同步控制方法
- 007Java维基准测试框架JMH
- 008Java并发容器
- 009Java的线程实现
- 010Java关键字synchronized
- 011一些并行模式的熟悉
- 单例模式和不变模式
- 生产者消费者模式
- Future模式
- 012一些并行算法的熟悉
- 面试总结
- 长亮一面