类从加载到虚拟机中开始,直到卸载为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。
其中,验证、准备和解析这三个部分统称为连接(linking)。
![图片[1]-类装载的执行过程详解-编程社](https://cos.bianchengshe.com/wp-content/uploads/2023/12/image-73.png?imageMogr2/format/webp/interlace/1/quality/100)
类加载过程详解
加载
![图片[2]-类装载的执行过程详解-编程社](https://cos.bianchengshe.com/wp-content/uploads/2023/12/image-74.png?imageMogr2/format/webp/interlace/1/quality/100)
- 通过类的全名,获取类的二进制数据流。
- 解析类的二进制数据流为方法区内的数据结构(Java类模型)
- 创建java.lang.Class类的实例,表示该类型。作为方法区这个类的各种数据的访问入口
![图片[3]-类装载的执行过程详解-编程社](https://cos.bianchengshe.com/wp-content/uploads/2023/12/image-75.png?imageMogr2/format/webp/interlace/1/quality/100)
验证
![图片[4]-类装载的执行过程详解-编程社](https://cos.bianchengshe.com/wp-content/uploads/2023/12/image-76.png?imageMogr2/format/webp/interlace/1/quality/100)
验证类是否符合JVM规范,安全性检查
(1)文件格式验证:是否符合Class文件的规范
(2)元数据验证
- 这个类是否有父类(除了Object这个类之外,其余的类都应该有父类)
- 这个类是否继承(extends)了被final修饰过的类(被final修饰过的类表示类不能被继承)
- 类中的字段、方法是否与父类产生矛盾。(被final修饰过的方法或字段是不能覆盖的)
(3)字节码验证– 主要的目的是通过对数据流和控制流的分析,确定程序语义是合法的、符合逻辑的。
(4)符号引用验证:符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量
比如:int i = 3; 字面量:3 符号引用:i
准备
![图片[5]-类装载的执行过程详解-编程社](https://cos.bianchengshe.com/wp-content/uploads/2023/12/image-77.png?imageMogr2/format/webp/interlace/1/quality/100)
为类变量分配内存并设置类变量初始值
- static变量,分配空间在准备阶段完成(设置默认值),赋值在初始化阶段完成
- static变量是final的基本类型,以及字符串常量,值已确定,赋值在准备阶段完成
- static变量是final的引用类型,那么赋值也会在初始化阶段完成
![图片[6]-类装载的执行过程详解-编程社](https://cos.bianchengshe.com/wp-content/uploads/2023/12/image-78.png?imageMogr2/format/webp/interlace/1/quality/100)
解析
![图片[7]-类装载的执行过程详解-编程社](https://cos.bianchengshe.com/wp-content/uploads/2023/12/image-79.png?imageMogr2/format/webp/interlace/1/quality/100)
把类中的符号引用转换为直接引用
比如:方法中调用了其他方法,方法名可以理解为符号引用,而直接引用就是使用指针直接指向方法。
![图片[8]-类装载的执行过程详解-编程社](https://cos.bianchengshe.com/wp-content/uploads/2023/12/image-80.png?imageMogr2/format/webp/interlace/1/quality/100)
初始化
![图片[9]-类装载的执行过程详解-编程社](https://cos.bianchengshe.com/wp-content/uploads/2023/12/image-81.png?imageMogr2/format/webp/interlace/1/quality/100)
对类的静态变量,静态代码块执行初始化操作
- 如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。
- 如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。
使用
![图片[10]-类装载的执行过程详解-编程社](https://cos.bianchengshe.com/wp-content/uploads/2023/12/image-82.png?imageMogr2/format/webp/interlace/1/quality/100)
JVM 开始从入口方法开始执行用户的程序代码
- 调用静态类成员信息(比如:静态字段、静态方法)
- 使用new关键字为其创建对象实例
卸载
当用户程序代码执行完毕后,JVM 便开始销毁创建的 Class 对象,最后负责运行的 JVM 也退出内存
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容