原文:http://www.ityouknow.com/jvm/2017/08/19/class-loading-principle.html
一. 类的生命周期:
1. 类加载:查找并加载类的二进制数据,虚拟机需要完成以下三件事情:
- 将.class文件的二进制数据加载到内存中的运行时数据区的方法区内;
- 将二进制数据所代表的静态存储结构转化为方法区的运行时数据结构;
- 在Java堆中生成代表这个类的
java.lang.Class
对象,并提供方法区中这些数据的访问入口;
2. 验证:确保被加载的类的正确性
验证的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
验证阶段大致会完成4个阶段的检验动作:
- 文件格式验证:验证字节流是否符合Class文件格式的规范;例如:是否以
0xCAFEBABE
开头、主次版本号是否在当前虚拟机的处理范围之内、常量池中的常量是否有不被支持的类型。 - 元数据验证:对字节码描述的信息进行语义分析(注意:对比javac编译阶段的语义分析),以保证其描述的信息符合Java语言规范的要求;例如:这个类是否有父类,除了
java.lang.Object
之外。 - 字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。
- 符号引用验证:确保解析动作能正确执行。
3. 准备:为类的静态变量分
配内存,并将其初始化为默认值
准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中分配。
4. 解析:把类中的符号引用转换为直接引用
把类型中的符号引用转换为直接引用。???
5. 初始化:为类的静态变量赋予正确的初始值
JVM初始化步骤
- 1、假如这个类还没有被加载和连接,则程序先加载并连接该类
- 2、假如该类的直接父类还没有被初始化,则先初始化其直接父类
- 3、假如类中有初始化语句,则系统依次执行这些初始化语句
6. 结束生命周期
在如下几种情况下,Java虚拟机将结束生命周期
- 执行了
System.exit()
方法 - 程序正常执行结束
- 程序在执行过程中遇到了异常或错误而异常终止
- 由于操作系统出现错误而导致Java虚拟机进程终止