文章目录
- 类装载的执行过程
- 1.加载
- 2.验证
- 3.准备
- 4.解析
- 5.初始化
- 6.使用
- 7.卸载
类装载的执行过程
类装载总共分为7个过程,分别是
加载,验证,准备、解析、初始化、使用、卸载
1.加载
将
类的字节码文件
加载到内存
(元空间)中。这一步会创建一个与被加载类对应的Class对象。
通过类的全名,获取类的二进制数据流。
解析类的二进制数据流为方法区内的数据结构(Java类模型)
创建java.lang.Class类的实例,表示该类型。作为方法区
这个类的各种数据的访问入口
2.验证
验证类是否
符合 JVM规范
,安全性检查
,不会造成安全或内存损坏等问题
前三
个都属于格式检查
,第四
个符号引用验证
其实就是看class字节码中的程序指令
对应的符号在常量池
中是否有对应的类和方法
,检查是否存在,不存在就会报相应不存在的错误
3.准备
为类
变量分配内存
并设置类变量初始值
例如如下类
static变量,分配空间在准备阶段完成(设置默认值),赋值在初始化阶段完成
static变量是final的基本类型
,以及字符串常量,值已确定
,赋值
在准备阶段完成
static变量是final的引用类型
,那么赋值
会在初始化阶段
完成
4.解析
把类中的
符号引用转换为直接引用
符号引用指的是用于描述
对其他类、字段、方法的引用的符号
,而直接引用则是指向具体内存地址的指针
。
5.初始化
对类的
静态变量,静态代码块
执行初始化
操作
初始化规则就是
- 如果初始化一个类的时候,其
父类尚未初始化
,则优先初始化其父类
。 - 如果同时包含多个静态变量和静态代码块,则按照
自上而下
的顺序依次执行。
6.使用
在程序运行期间,
使用已经加载和初始化的类。
JVM 开始从入口方法开始执行用户的程序代码
- 调用静态类成员信息(比如:静态字段、静态方法)
静态的直接调用
- 使用new关键字为其创建对象实例
非静态的先new个对象实例,再通过对象调用
7.卸载
当不再需要某个类时,卸载它以释放内存空间。或者程序结束,也会自动卸载