JVM(一)类加载阶段分解
2020-03-18 本文已影响0人
r09er
类加载器深入解析与阶段分解
类加载阶段
- 在Java代码中,
类型
的加载
,连接
与初始化
过程都是在程序运行期间
完成 - 提供了更大的灵活性,增加了更多的可能性
加载
- 将已存在的磁盘的类的class文件加载到内存中
连接
- 对字节码的处理,验证,校验
- 类与类之间的符号引用转为直接引用
初始化
- 对于静态变量进行赋值
JVM规范对类加载的阶段进行了约束,但是具体情况需要根据运行时的JVM环境进行判断.
结束生命周期的情况
- System.exit()
- 程序正确执行结束
- 执行过程中遇到了异常或者错误而终止
- 由于操作系统出现错误而导致java虚拟机进程终止
类的加载,连接与初始化
加载
查找并加载类的二进制数据
连接
细分过程
-
验证:确保必备加载的类正确性
确保没有篡改,正确性
-
准备:为类的
静态变量
分配内存,并将其初始化为默认值
在准备阶段,并不会将具体值赋值给变量,在如下代码中,在准备阶段会将
a
初始化为默认值0class Test{ public static int a = 1; }
-
解析:把类的
符号引用
转为直接引用
- 符号引用:可以理解为间接的方式引用,譬如一个类的方法引用的另一个类
- 直接引用:直接将方法通过指针的方式指向目标对象的内存
初始化
为类的静态变量赋予正确的初始值
使用
程序正常使用类,平常打交道的阶段
卸载
从内存中卸载类,卸载之后就不能使用,但是也能重新加载到内存.例如OSGI
类加载流程图
![](https://img.haomeiwen.com/i2786935/9234c5840da4d550.png)
![](https://img.haomeiwen.com/i2786935/09d3bcd53f5ddbdf.png)
类加载的最终产物
类的加载最终产物是位于内存中的Class对象
Class对象封装了类在方法区内的数据结构,并且向Java开发人员访问方法区内的数据结构的接口