周期 | 内容 |
---|---|
加载 | 把类信息加载到JVM方法区中,并在栈区中创建这个类的java.lang.Class对象,作为访问这个类信息的入口。 |
验证 | 验证加载的内容能否被JVM正确运行。 |
准备 | 为类的静态变量分配内存,并赋JVM的默认值。 |
解析 | 把类在常量池中的符号引用转为直接引用,即类的方法名、字段名等转为直接的内存地址。 |
初始化 | 在程序首次主动使用类的时候,执行类的初始化语句,给静态变量赋值。 |
使用 | 使用类… |
卸载 | 当JVM中不存在该类的任何实例,并且该类的Class对象没任何地方被引用,并且加载类的ClassLoader已被回收,那么清空该类在方法区中的信息。 |
重点解析
- 验证、准备、解析属于连接阶段
- 连接阶段与加载阶段可以是并行的,但一定是加载先开始,连接后结束
- 加载的方式有多种,可能是读取class文件,读取jar/zip,或者动态生成
- 加载的时机取决于JVM的具体实现,预期会用到就加载,或者用到才加载
- 只有当程序”首次”并且是”主动使用”类的时候,才会执行初始化
- 什么叫主动使用:
- 创建类的实例
- 访问类的静态变量、或给该类的静态变量赋值
- 调用累的静态方法
- 反射调用类的静态方法、或反射创建类实例(与第一点相同)
- 初始化一个类的子类(构造函数中先要调父类的构造函数)
- JVM启动时被标明为启动类
- 什么叫被动使用:
- 不是主动使用的情况,都算被动使用
- 类的静态变量初始化是从上往下执行赋值的