[toc]
## 一、类加载过程
>[danger] 数组类型不通过类加载器创建,它由 Java 虚拟机直接创建。
### 类加载器
![](https://img.kancloud.cn/64/43/6443eac893fe26ba7568f3947c24fea9_491x180.png)
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`作为父类加载器。
![](https://img.kancloud.cn/83/e8/83e8d3d03fb2bd74194a6d2e6585b2e3_493x511.png)
## 三、参考
[搞定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工作原理