上一篇我们吃透了 Class文件与字节码指令 ,知道了 .java 源码会编译成 JVM 可识别的 .class 字节码文件。
那新的问题来了:硬盘上的 class 文件,是怎么跑进 JVM 内存、被程序调用、最终创建出对象的?
这就是今天的核心:JVM 类加载机制。
一、什么是类加载?
先搞懂核心定义,再学底层体系。
类加载 :就是 JVM 把硬盘上的 .class 字节码文件,读取到内存中,校验、解析、初始化,最终变成可直接使用的运行时类结构的全过程。
没有类加载,class 文件永远只是硬盘上的静态文件,无法创建对象、无法执行方法。
而关于类加载模块,以 JDK8 为例,总结为三点:
- 每个类加载器对加载过的类保持一个缓存。
- 双亲委派机制,即向上委托查找,向下委托加载。
- 沙箱保护机制。
简单一句话:类加载,是 Java 代码从"静态文件"变成"可运行程序"的唯一入口。
二、JDK8 完整类加载体系(四层加载器层级)
JDK8 的类加载体系是固定四层层级结构,自上而下优先级严格区分,所有类的加载都离不开这四类加载器,这也是后续所有机制的基础。
整体层级从上到下:启动类加载器 → 扩展类加载器 → 应用类加载器 → 自定义类加载器
2.1 启动类加载器(Bootstrap ClassLoader)
顶层、权限最高、JVM 内置的原生加载器,由 C++ 编写,无 Java 实例。
负责加载 :JDK 核心底层类,也就是 rt.jar 包中的所有核心类。
举例:String、Object、Integer、系统核心工具类。
特点:权限最高、优先级最高、用户无法干预。
2.2 扩展类加载器(Extension ClassLoader)
上层第二层,负责加载 JDK 扩展目录下的 jar 包和类。
负责加载:JDK 扩展功能类、系统拓展工具类。
特点:补充系统基础能力,不加载用户业务代码。
2.3 应用类加载器(Application ClassLoader)
我们日常开发最常用的加载器,也是系统默认的加载器。
负责加载:项目自己写的代码、引入的第三方 Maven 依赖包。
特点:普通业务类、框架类全部由它加载,是使用频率最高的加载器。
2.4 自定义类加载器(Custom ClassLoader)
开发者自己继承 ClassLoader 实现的加载器,属于最底层加载器。
使用场景:热部署、代码加密加载、动态加载 class 文件、模块化加载。
特点:灵活性最高,优先级最低,仅上层加载器无法加载时才会生效。
2.5 核心关联总结
这四层加载器不是各自独立 ,而是通过 双亲委派机制 串联成一套完整的加载规则,这也是 JDK8 类加载体系的核心灵魂。
三、双亲委派机制:类加载的核心运行规则
有了四层加载体系,就必须有一套规则约束它们的加载顺序,这套规则就是 双亲委派机制。
所有面试必问、所有类加载逻辑,全部基于此机制展开。
3.1 定义
当一个类加载器收到加载请求时:
先向上层层委托查询,父级优先加载;上级加载不了,下级才自己加载。
口诀:向上委派查找,向下兜底加载。
3.2 完整执行流程(一步不差)
-
我们的业务类,默认由 应用类加载器 接收加载请求
-
应用类加载器不着急加载,先委派给 扩展类加载器
-
扩展类加载器继续向上委派给 启动类加载器(顶层终点)
-
启动类加载器判断:是系统核心类就直接加载,不是就返回无法加载
-
逐层向下回传,最终由能加载的最低层级加载器完成加载
3.3 双亲委派三大核心作用
-
避免类重复加载:父级加载过的类,子级不再重复加载,节省内存、提升效率
-
保证核心类唯一:系统核心类永远由顶层加载器加载,全局唯一
-
天然安全隔离:杜绝用户自定义类覆盖系统核心类(衔接下一节沙箱机制)
3.4 关键关联
双亲委派机制,是四层类加载体系的运行规则,没有它,四层加载器会混乱冲突、重复加载、存在安全漏洞。
四、沙箱保护机制:双亲委派带来的安全兜底
很多人分不清双亲委派和沙箱机制的关系,这里直白说透:
双亲委派是加载规则,沙箱保护是这套规则带来的安全结果。二者因果关联、密不可分。
4.1 沙箱机制核心作用
禁止用户自定义类篡改、覆盖 JDK 系统核心类,保障 JVM 底层运行安全、稳定、统一。
4.2 经典实战案例(秒懂原理)
我们手动创建一个包 java.lang,并自定义一个 String 类:
看似和 JDK 自带的 String 一模一样,企图覆盖系统类、篡改底层逻辑。
但最终运行会直接报错,无法生效,原因就是沙箱保护:
-
程序加载自定义 String 类,请求交给应用类加载器
-
遵循双亲委派,层层向上委托到启动类加载器
-
启动类加载器发现:
java.lang.String是系统核心类 -
直接加载 JDK 原生的 String 类,忽略用户自定义类
4.3 沙箱机制核心价值
如果没有这套机制,开发者可以随意篡改系统核心类,导致 JVM 底层逻辑错乱、漏洞泛滥、程序彻底失控。
总结关联:JDK8四层加载体系 → 依托双亲委派规则 → 实现沙箱安全保护。
五、类与对象的终极关系:加载机制的最终落地
前面所有的加载体系、委派规则、安全机制,最终都是为了一件事:正确、安全地在内存中生成类,进而创建对象。
这也是整条链路的最后一环,完美闭环。
5.1 区分:类 和 对象
-
类(Class):模板、蓝图、静态结构,存在于 JVM 方法区(元空间),全局唯一
-
对象(Object):模板的实例、具体产物,存在于 JVM 堆内存,可以有无数个
5.2 依托类加载机制的完整链路
我们结合全文知识点,串联完整执行流程:
-
编写 Java 代码,编译生成
.class文件(静态文件) -
JDK8 四层加载器,通过双亲委派机制加载 class 文件
-
沙箱机制拦截非法自定义系统类,保证加载安全
-
合法的类信息存入元空间,生成唯一的 Class 模板
-
程序通过
new关键字,根据 Class 模板,在堆中创建无数对象
5.3 核心本质关系
-
类是对象的模板,对象是类的实例
-
一个 Class 模板,可以创建成千上万个对象
-
一个对象,只能归属一个 Class 模板
-
类加载机制保证:内存中类模板唯一、安全、不重复
5.4 关键关联闭环
四层加载体系是基础 → 双亲委派是运行规则 → 沙箱是安全保障 → 最终产出唯一Class模板 → 支撑所有对象的创建。
四个章节,层层递进,缺一不可!