# 類加載機制
## 類的生命周期

## 加載

## 驗證
文件格式驗證,元數據驗證(語義校驗),字節碼驗證(邏輯校驗),符號引用校驗

## 準備
為類變量(static的)分配內存并賦初始值。

## 解析
主要針對:
* 類或接口:CONSTANT_Class_info
* 字段:CONSTANT_Fieldref_info
* 類方法:CONSTANT_Methodref_info
* 接口方法:CONSTANT_InterfaceMethodref_info
(以下3種,是JDK1.7新增的動態語言支持,后續介紹)
* 方法類型:CONSTANT_MethodType_info
* 方法句柄:CONSTANT_MethodHandle_info
* 調用點限定符:CONSTANT_InvokeDynamic_info

## 初始化


測試:
~~~
/**
* 死循環類
* @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一些并行算法的熟悉
- 面試總結
- 長亮一面