【JVM】类的生命周期

本文解析了Java类的生命周期,包括加载、连接(验证、准备、解析)、初始化和卸载,以及这些阶段的具体操作和触发条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类的生命周期

类的生命周期:描述一个类加载、使用、卸载的整个过程。
主要分为五个大的阶段:加载、链接、初始化、使用、卸载。
在这里插入图片描述
其中连接可以分为三个小阶段:验证、准备、解析。
在这里插入图片描述

加载

1.加载(Loading)阶段的第一步是类加载器根据类的全限定名通过不同的渠道以二进制的方式获取字节码信息。
2.类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存方法区中。
3.类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存内存的方法区中。
生成一个InstanceKlass,保存类的所有信息,里面还包含实现特定功能比如多态的信息。在这里插入图片描述
4.同时Java虚拟机会在堆中生成一份与方法区中数据类似的java.long.Class对象
作用是在Java代码中去获取类的信息以及存储静态字段的数据(JDK8之后)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

连接

连接主要分为三个小阶段:验证、准备、解析。
在这里插入图片描述
验证:主要目的验证JAVA字节码文件是否遵守《JAVA虚拟机规范》
校验的主要内容如下:
1.文件格式验证,比如文件是否以OxCAFEBABE开头,主次版本号是否满足当前Java虚拟机版本要求。
2.元信息验证,例如类必须有父类(super不能为空)。
3.验证程序执行指令的语义,比如方法内的指令执行到一半强行跳转到其他方法中去。
4.符号引用验证,例如是否访问了其他类中private的方法等。

校验案例
在这里插入图片描述
准备阶段:静态(static)变量分配内存并设置初始值。
在这里插入图片描述
final修饰的基本数据类型的静态变量,准备阶段将代码中的值进行赋值.
在这里插入图片描述

解析

解析阶段主要将常量池中的符号引用替换为直接引用
直接引用不在使用编号,而是使用内存中的地址进行访问数据
在这里插入图片描述
在这里插入图片描述

初始化阶段

1.初始化阶段会执行静态代码块中的代码,并为静态变量赋值.
2.初始化阶段会执行字节码中的clinit部分的字节码指令
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以下几种方式会导致类的初始化:
1.访问一个类的静态变量或者静态方法,注意变量是final修饰的并且等号右边是常量不会触发初始化。
2.调用Class.forName(String className)。
3.new一个该类的对象时。
4.执行Main方法的当前类。
举例
1.访问一个类的静态变量或者静态方法,注意变量是final修饰的并且等号右边是常量不会触发初始化。
测试代码
在这里插入图片描述
添加vm参数用于打印
在这里插入图片描述
输出结果
在这里插入图片描述
修改为final后不进行初始化
在这里插入图片描述
2.调用Class.forName(String className)。
在这里插入图片描述
3.new一个该类的对象时
在这里插入图片描述
相关笔试题
在这里插入图片描述
clinit指令在特定情况下不会出现:
1.无静态代码块且无静态变量赋值语句。
在这里插入图片描述
2.有静态变量的声明,但是没有赋值语句。

public static int i;

3.静态变量的定义使用final关键字,这类变量会在准备阶段直接进行初始化。

public static final int i=10;

相关笔试题
1.
在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述
4.
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值