类加载过程
文章目录
类加载过程
类的生命周期说一下
加载、连接(验证,准备,解析)、初始化、使用、卸载
类的加载过程具体说一下
类的加载包括了加载、连接(验证,准备,解析)、初始化
- 加载
- 通过全类名获取定义此类的二进制字节流
- 将字节流所代表的静态存储结构转换为运行时数据区的结构
- 在内存中生成一个代表该类的Class对象,作为方法区这些数据的访问入口
- 验证
- 文件格式验证
- 元数据验证
- 字节码验证
- 符号引用验证
- 准备
- 为类变量(static)分配内存并设置类变量初始值
- 准备阶段初始化为0值,等到初始化阶段才会赋值。==但是有特殊情况,如果是final static的变量,那么准备阶段就会被赋值了==
- 解析
- 将常量池内的符号引用替换为直接引用的过程
- 符号引用就是一组符号来描述目标,可以是任何字面量。直接引用就是直接指向目标的指针。
- 初始化
- 调用
<clint>
方法,就是执行静态代码块 - 只有以下6中情况会发生初始化
- 遇到new、getstatic、putstatic、invokestatic
- 反射,比如class.forName(…),newInstance等
- 初始化一个类,其父类还没初始化,先让其父类初始化
- 包含main方法的主类,会先初始化
- MethodHandle和VarHandle可以看作是轻量级的反射,要用这两个,需要先使用findStaticVarHandle来初始化要调用的类
- 当一个接口定义了JDK8中新的default接口方法时,如果实现类发生了初始化,那该接口要在其之前被初始化
卸载发生的条件
- 该类的所有的实例对象都被GC了,堆中不存在该类的任何对象
- 该类没有在其他地方被引用
- 该类的类加载器的实例已被GC
卸载是什么意思
该类的class对象被GC
文章作者 LYR
上次更新 2021-08-17