六、类的生命周期
2020年12月21日
10:51
目录 |
- 1. 加载 - 2. 连接 - 2.1 验证 - 2.2 准备 - 2.3 解析 - 3. 卸载
|
1. 加载
此阶段完成3件事,还有一些其他细节这里暂时不展开。
- 加载类的二进制字节流
- 转换数据结构存于方法区
- 内存中生成该类的类对象
2. 连接
2.1 验证
主要是检查合法性。包括:
2.2 准备
此处开始为类变量分配内存并设置类变量初始值。不过这个过程应该和对象初始化过程
Step 4 初始化零值做对比。
- 只包括类变量,即静态变量。实例变量是在对象创建过程被初始化的。
- 初始值是默认值,除非声明final,例如public static final int value=111 ,那么准备阶段 value 的值就被赋值为 111
2.3 解析
常量池里的符号引用转为为直接引用的过程。从这里可以理解符号引用是什么。
简单来说,原来任何类、接口、类方法、接口方法、方法类型这些都是一堆符号而不是真实的内存地址,这一步就会将这些符号与内存中实际存放偏移量做映射。
初始化
初始化是类加载的最后一步,也是真正执行类中定义的 Java 程序代码(字节码),初始化阶段是执行初始化方法 <clinit> ()方法的过程。
这是“类初始化”,必须和对象初始化,类对象初始化区分开。类初始化是一个独立的过程。
JAVA虚拟机对类初始化时机有严格的规范,防止多线程死锁的出现。
- 主动使用类的时候,类发生初始化
- new,访问静态变量、方法
- 注意,静态块,静态变量的初始化在这里完成
- 反射机制创建实例
- 子类初始化前,父类会初始化
- 其他java内部的
- main,methdHandle,VarHandle,defualt
3. 卸载
就是类对象被GC。在2.5 如何判断一个类是无用的?已经讨论过,类的GC需要满足:
- 无实例
- 无引用
- 无Loader