jvm中类的生命周期过程

41 阅读2分钟

1、加载(Loading):

通过类的完全限定名,JVM会查找此类的二进制字节码文件(通常是.class文件)。 将找到的二进制字节码文件加载到JVM中,并在堆中创建对应的Class对象。这个Class对象包含了类的元数据信息(如类的名称、字段、方法等)。

2、链接(Linking):

链接过程包括三个阶段:验证、准备和解析。

1、验证(Verification): (1)确保Class文件符合虚拟机规定的Class文件格式。 (2)包括文件格式验证、元数据验证、字节码验证和引用符号验证。 (3)检查类的结构、语义、字节码和二进制兼容性。 2、准备(Preparation): (1)为类的静态变量分配内存并设置初始化值。 (2)对于对象类型的静态变量,赋值为null;对于基本数据类型的静态变量,赋值为默认值(如0、false等)。 (3)需要注意的是,如果是final修饰的静态变量,则在准备阶段就已经完成赋值。 3、解析(Resolution): (1)将常量池中的符号引用转换为直接引用。 (2)解析过程可能包括字段解析、接口解析和方法解析。 (3)符号引用是声明性的引用,而直接引用是地址或句柄的引用。

3、初始化(Initialization):

1、初始化静态变量和静态块。 2、如果类有父类,先初始化父类,再初始化当前类。 3、只有对类主动使用时(如实例化对象、读取和设置类的静态变量、调用静态方法等)才会进行初始化。

4、使用(Using):

1、在程序代码执行时,使用已加载和初始化的类。 2、通过new关键字创建类的实例,或在代码中调用类的方法。

5、卸载(Unloading):

1、当类不再被使用,并且满足垃圾回收的条件时,JVM会卸载这个类。 2、卸载过程会回收类在内存中占用的空间。

需要注意的是,类的加载、链接和初始化过程是按顺序进行的,但解析阶段在某些情况下可能在初始化阶段之后开始,因为Java支持运行时绑定。此外,类的加载时机由JVM的类加载器根据需要进行控制。