【JVM】类的生命周期

📝个人主页:五敷有你**
🔥系列专栏:并发编程
⛺️稳重求进,晒太阳**

声明生命的概述

加载阶段

  1. 加载阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。
  2. 类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到内存的方法区中
  3. 生成一个InstanceKlass对象保存类的所有信息,里面还包含实现特定功能,比如多态的信息。

4.同时,Java虚拟机还会在堆中生成一份与方法区中数据类似的java.lang.Class对象

作用是在Java代码中去获取类的信息,以及存储静态字段的数据(JDK8之后)

查看内存中的对象

使用JDK自带的hsdb工具查看Java虚拟机内存信息,工具位于JDK安装目录下lib文件夹中的sa-jdi.jar中

连接阶段

验证

连接的第一个环节是验证,验证的主要目的是检验Java字节码文件是否遵守了《Java虚拟机规范》z中的约束,这个阶段一般不需要程序员参与

主要包含如下四个部分:(详细见Java虚拟机规范)

  1. 文件格式校验, 魔数和主次版本号
  2. 元信息校验,例如:类必须有父类(super不能为空)
  3. 验证程序执行指令的语言,比如方法内的指令执行到一半强行跳转其他方法
  4. 符号验证引用

准备

准备阶段为静态变量(static)分配内存并设置初始值。

每一种基本类型和引用都有初始值(防止之前出现数据残留)

解析

解析主要是将常量池中的符号引用替换为直接引用

直接引用不再使用编号,而是使用内存中的地址进行具体的数据访问。

初始化阶段

  • 初始化阶段会执行静态代码块中的代码,并为静态变量赋值,执行流程与代码流程一致(如下)。
  • 初始化阶段会执行字节码文件中clinit部分的字节码指令。
以下几种方式会导致类的初始化

(添加-xx+TraceClassLoading 参数可以打印出加载并初始化的类)添加在JVM中

  1. 访问一个类的静态变量或者静态方法,注意变量是final修饰的并且等号右边是常量不会触发初始化。
  2. 调用Class.forName(String className)
  3. new一个该类的对象
  4. 执行Main的当前类
clinit指令在特定情况下不会出现

比如:几种情况是不会进行初始化指令执行的:

  1. 无静态代码块,且无静态变量赋值语句
  2. 有静态变量的声明,但没有赋值语句
  3. 静态变量 的定义使用final关键字,这类变量会在准备阶段直接初始化。
如果有继承关系是什么情况

访问父类的静态变量,只会初始化父类

访问子类的静态变量,会先初始化父类

练习:

分析如下代码的运行结果

java 复制代码
package jvm;
public class Test2 {
    public static void main(String[] args) {
        TestA[] testAS=new TestA[10];
    }

}
 class TestA{
    static {
        System.out.println("TestA执行类...");
    }
}

jclasslib查看结果如下:并没有初始化

数组的创建不会导致数组中元素的类进行初始化

相关推荐
2602_959960925 小时前
电商大厂Java面试实录:Spring Boot/JVM/Redis/Kafka/微服务/安全/测试全解析
java·jvm·spring boot·redis·面试题
Javatutouhouduan1 天前
Java初学者如何高效学习JVM?
java·jvm·java虚拟机·java面试·后端开发·java程序员·java八股文
2602_959960921 天前
电商场景Java面试:Spring Boot、JVM、Redis、Kafka、微服务与分布式事务考点解析——谢飞机的作死面试记
java·jvm·spring boot·redis·面试题
wuminyu1 天前
JDK21中FFM api的upcall回调机制解析
java·linux·c语言·jvm·c++
松仔log1 天前
Kotlin中级——协程
java·jvm·kotlin
吴声子夜歌2 天前
Java面试题——JVM(二)
java·开发语言·jvm
Dicky-_-zhang3 天前
大模型部署架构:从推理引擎到弹性扩缩容的工程实践
java·jvm
聊浮游3 天前
JAVA2026最新全套学习资料、学习路线
java·开发语言·jvm·mysql·spring·maven·idea
阿昌喜欢吃黄桃3 天前
RocketMQ 同一 JVM 启动多个 Producer 导致 NameServer 只连一个的问题
jvm·rocketmq·mq
2602_959960923 天前
大厂Java面试:Spring Boot、JVM、Redis、Kafka与Elasticsearch在内容社区UGC场景下的实战拷问
java·jvm·spring boot·redis·面试题