1、加载
加载的过程本质上是一个读取二进制数据的过程。可以是文件,网络数据,内存中的数据等,这一阶段是可以自定义的。加载过程中会在堆中初始化一个 class 对象。
2、验证
验证就是验证这堆二进制数据是不是有效的,就是这个 class 数据是否可以载入虚拟机。例如验证文件是否是 0xCAFEBAB 开头,再验证版本号是否被当前 JVM 支持,然后再校验内部的变量等等是否符合规范。
3、准备
准备阶段会在内存中开辟出空供静态变量使用。
4、解析
解析过程就是读取 class 文件的内容然后解析出里面的变量值的等。
5、初始化
解析出来的变量值赋值放到在准备阶段开辟的内存空间中。
6、使用
在堆中寻找到 class ,找到构造方法,执行构造方法便完成一个对象的使用。
7、卸载
卸载一个类不怎么常见,用途的话一般是服务器动态部署等,例如 Tomcat 解除部署一个网站,这时候就要从内存中卸载关联的类,卸载的过程一般包括清除 class 对象,清除静态变量等。