「每天一道面试题」Java类的生命周期包括哪几个阶段?

时间:2024-06-27 23:35:44

「每天一道面试题」Java类的生命周期包括哪几个阶段?

一个Java类被加载到虚拟机中,它的生命周期才算开始,直到被从内存中卸载,它的生命周期才算结束。从开始到结束,它的整个生命周期包括加载、验证、准备、解析、初始化、使用和卸载7个阶段,其中验证、准备和解析3个阶段又被统称为连接。

加载

加载阶段主要完成以下三件事:

  1. 通过一个类的全限定名来获取此类的二进制字节流;

  2. 将这个二进制字节流所代表的静态存储结构转为方法区的运行时数据结构;

  3. 在内存中生成一个代表此类的java.lang.Class的对象,作为访问这个类的入口。

验证

验证阶段主要是为了保证从加载阶段获取的字节流中包含的信息是符合虚拟机要求,并且对虚拟机来说是安全的。这个阶段主要完成4个方面的校验工作,包括文件格式验证、元数据验证、字节码验证和符号引用验证。

文件格式验证主要是验证字节流是否符合Class文件格式规范,以及字节流能否被虚拟机处理,例如字节流文件是否以魔数0xCAFEBABE开头、主次版本号是否是虚拟机能处理的版本等。

元数据验证主要是对字节码描述的信息进行语义分析,用来确保字节码描述信息符合Java语言规范,例如类的继承关系、类是否继承了不允许被继承的类、类实现了接口是否实现了接口中的所有方法等。

字节码验证主要是通过数据流和控制流来分析和确定程序的语义是否合法、符合逻辑,例如验证操作数栈中数据的存取是否会出现类型不匹配、跳转指令是否会跳转到方法体以外的字节码指令上等。

符号引用验证主要是确保解析动作能够正常执行,主要对常量池中的符号引用进行匹配性校验,例如符号引用中的类、属性和方法的访问性是否可以被当前类访问、能否通过字符串描述的全限定名来找到对应的类等。

准备

准备阶段正式为static修饰的变量分配内存并设置初始值。

解析

解析阶段将常量池中的符号引用替换为直接引用。

符号引用就是以一组符号来描述所引用的目标,它能够定位到目标。

直接引用就是直接指向目标的指针、相对偏移量或一个能够间接定位到目标的句柄。

初始化

初始化阶段按照程序员编写的代码给类变量赋值和执行其它资源,例如执行类变量的赋值操作和执行静态语句块等。

使用

使用阶段就是对象的初始化、操作和回收。

卸载

卸载阶段就是内存中不再存在该类的引用,完成从内存卸载的过程。