[toc]
## 一、類加載過程
>[danger] 數組類型不通過類加載器創建,它由 Java 虛擬機直接創建。
### 類加載器

JVM 中內置了三個重要的 ClassLoader,除了 BootstrapClassLoader 其他類加載器均由 Java 實現且全部繼承自`java.lang.ClassLoader`:
1. **BootstrapClassLoader(啟動類加載器)**:最頂層的加載類,由C++實現,負責加載`%JAVA_HOME%/lib`目錄下的jar包和類或者或被`-Xbootclasspath`參數指定的路徑中的所有類。
2. **ExtensionClassLoader(擴展類加載器)**:主要負責加載目錄`%JRE_HOME%/lib/ext`目錄下的jar包和類,或被`java.ext.dirs`系統變量所指定的路徑下的jar包。
3. **AppClassLoader(應用程序類加載器)**:面向我們用戶的加載器,負責加載當前應用classpath下的所有jar包和類。
## 二、雙親委派模型
### 雙親委派模型介紹
每一個類都有一個對應它的類加載器。系統中的 ClassLoder 在協同工作的時候會默認使用**雙親委派模型**。
1. 即在類加載的時候,系統會首先判斷當前類是否被加載過。已經被加載的類會直接返回,否則才會嘗試加載。
2. 加載的時候,首先會把該請求委派該父類加載器的`loadClass()`處理,因此所有的請求最終都應該傳送到頂層的啟動類加載器`BootstrapClassLoader`中。
3. 當父類加載器為null時,會使用啟動類加載器`BootstrapClassLoader`作為父類加載器。

## 三、參考
[搞定JVM面試之JVM 類加載器](https://snailclimb.gitee.io/2019/08/25/java/jvm/%E7%B1%BB%E5%8A%A0%E8%BD%BD%E5%99%A8/#toc-heading-3)
- 前言
- 第一部分 計算機網絡與操作系統
- 大量的 TIME_WAIT 狀態 TCP 連接,對業務有什么影響?怎么處理?
- 性能占用
- 第二部分 Java基礎
- 2-1 JVM
- JVM整體結構
- 方法區
- JVM的生命周期
- 堆對象結構
- 垃圾回收
- 調優案例
- 類加載機制
- 執行引擎
- 類文件結構
- 2-2 多線程
- 線程狀態
- 鎖與阻塞
- 悲觀鎖與樂觀鎖
- 阻塞隊列
- ConcurrentHashMap
- 線程池
- 線程框架
- 徹底搞懂AQS
- 2-3 Spring框架基礎
- Spring注解
- Spring IoC 和 AOP 的理解
- Spring工作原理
- 2-4 集合框架
- 死磕HashMap
- 第三部分 高級編程
- Socket與NIO
- 緩沖區
- Bybuffer
- BIO、NIO、AIO
- Netty的工作原理
- Netty高性能原因
- Rabbitmq
- mq消息可靠性是怎么保障的?
- 認證授權
- 第四部分 數據存儲
- 第1章 mysql篇
- MySQL主從一致性
- Mysql的數據組織方式
- Mysql性能優化
- 數據庫中的樂觀鎖與悲觀鎖
- 深度分頁
- 從一條SQL語句看Mysql的工作流程
- 第2章 Redis
- Redis緩存
- redis key過期策略
- 數據持久化
- 基于Redis分布式鎖的實現
- Redis高可用
- 第3章 Elasticsearch
- 全文查詢為什么快
- battle with mysql
- 第五部分 數據結構與算法
- 常見算法題
- 基于數組實現的一個隊列
- 第六部分 真實面試案例
- 初級開發面試材料
- 答案部分
- 現場編碼
- 第七部分 面試官角度
- 第八部分 計算機基礎
- 第九部分 微服務
- OpenFeign工作原理