本文最后更新于17 天前,其中的信息可能已经过时,如有错误请发送邮件到1169063119@qq.com
类从被加载到 JVM 开始,到卸载出内存,整个生命周期分为七个阶段,分别是加载、验证、准备、解析、初始化、使用和卸载。其中验证、准备和解析这三个阶段统称为连接。
加载
加载是一个读取class文件,将其转化为某种静态数据结构存储在方法区内,并在堆中生成一个便于用户调用的java.lang.class类型的对象的过程
连接
验证
JVM 会在该阶段对二进制字节流进行校验,只有符合 JVM 字节码规范的才能被 JVM 正确执行。该阶段是保证 JVM 安全的重要屏障,下面是一些主要的检查。
- 确保二进制字节流格式符合预期(比如说是否以
cafe babe开头,前面提到过)。 - 是否所有方法都遵守访问控制关键字的限定,protected、private 那些。
- 方法调用的参数个数和类型是否正确。
- 确保变量在使用之前被正确初始化了。
- 检查变量是否被赋予恰当类型的值。
- 还有更多。
准备
JVM 会在该阶段对类变量(也称为静态变量,static 关键字修饰的)分配内存并初始化,对应数据类型的默认初始值,如 0、0L、null、false 等。
解析
该阶段将常量池中的符号引用转化为直接引用。
初始化
该阶段是类加载过程的最后一步。在准备阶段,类变量已经被赋过默认初始值,而在初始化阶段,类变量将被赋值为代码期望赋的值。换句话说,初始化阶段是执行类构造器方法(javap 中看到的 <clinit>() 方法)的过程。
初始化时机包括以下这些:
- 创建类的实例时。
- 访问类的静态方法或静态字段时(除了 final 常量,它们在编译期就已经放入常量池)。
- 使用 java.lang.reflect 包的方法对类进行反射调用时。
- 初始化一个类的子类(首先会初始化父类)。
- JVM 启动时,用户指定的主类(包含 main 方法的类)将被初始化。




