首页 > 其他分享 >【JVM】——类的生命周期——连接阶段和初始化阶段

【JVM】——类的生命周期——连接阶段和初始化阶段

时间:2024-05-28 19:05:13浏览次数:12  
标签:初始化 变量 静态 clinit 阶段 JVM 执行 赋值

【喜欢的话可以一键三连+关注哦~】 你的三连+关注是对我最大的支持!之后也会继续更新本专栏呦 ~~
连接阶段
验证

验证内容是否满足《Java虚拟机规范》(这个阶段程序员一般不需要参与)

准备

给静态变量(static)分配内存设置初始值

final修饰的基本数据类型的静态变量,准备阶段直接会将代码中的值进行赋值。

解析

将常量池中的符号引用替换成指向内存的直接引用

符号引用就是在字节码文件中使用编号来访问常量池中的内容

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

初始化阶段

这个value的值为1是从初始化阶段来完成的。

初始化阶段会执行静态代码块中的代码,并为静态变量赋值

初始化阶段会执行字节码文件中clinit(类的初始化)部分的字节码指令。

具体流程:

首先执行源码里面的那个语句(如图片),然后执行字节码指令将常量1放入操作数栈。

将操作数栈中的1赋值给常量池中编号为2的变量,它就是Demo1里面的value变量。由于在之前在堆区中给value赋值为0,这时我们需要将操作数栈中的1赋值进去。

之后的步骤就与上面的流程类似(图片在下)

那么问题来了,如果说将上面两句话对调顺序,结果会怎么样呢?

由于clinit方法中的执行顺序与Java中编写的顺序是一致的,所以最终的结果是1

以下几种方式会导致类的初始化:

1.访问一个类的静态变量或者静态方法,注意变量是final修饰的并且等号右边是常量不会触发初始化。

2.调用Class.forName(String className)。

3.new一个该类的对象时。

4.执行Main方法的当前类。

这个参数的开启方式

最后在点击一下OK,我们就开启成功了!!!!

大厂面试题!!!!!!

执行main方法先初始化Test1的初始化方法,输出结果为DA。

执行两次Test1的构造方法,输出结果为DACBCB

插一嘴:是不是有人会有疑惑?为什么C会在B前面执行?其原因是{}是构造代码块,每一次创建对象时执行,始终在构造方法前执行。

整体的执行步骤:

clinit指令在特定情况下不会出现,比如:如下几种情况是不会进行初始化指令执行的。

1.无静态代码块且无静态变量赋值语句。

2.有静态变量的声明,但是没有赋值语句。

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

出现继承初始化阶段会怎么样呢?

直接访问父类的静态变量,不会触发子类的初始化。

子类的初始化clinit调用之前,会先调用父类的clinit初始化方法。

标签:初始化,变量,静态,clinit,阶段,JVM,执行,赋值
From: https://blog.csdn.net/m0_72647000/article/details/139274894

相关文章

  • Alpha阶段项目复审
    Alpha阶段项目复审复审负责人:全队参与讨论小组的名字和连接优点缺点,bug报告最终名次码农探花队团队工作分配充分合理,项目设计管理妥当,页面简洁美观,操作直观团队github代码缺少注释,程序实际功能完成较少6软工团队6团队工作分配较合理,项目设计较完善,程序功能齐......
  • Alpha阶段项目复审
    项目复审报告一、Bug概述在测试过程中,我们发现了几个具体的bug:注册功能:当两次输入的密码不一致时,页面没有给出任何错误提示。书籍展示:上传的书籍图片无法正常显示,可能是由于图片上传路径配置错误或图片处理逻辑存在问题。交易功能:当卖家下架书籍时,预订者无法收到通知,这可能......
  • JVM调优维护常用工具之Jconsole 监控管理
    Jconsole(JavaMonitoringandManagementConsole)是JDK中自带的java监控和管理控制台,用于对JVM中内存、线程和类等的监控,是一个基于JMX(javamanagementextensions)的GUI性能监测工具。jconsole使用jvm的扩展机制(接口、抽象类、反射、DubboSPI机制之一JDK中的SPI等)获取......
  • Java-JVM-运行时数据区
    参考:面试必问,JVM内存模型详解一篇文章掌握整个JVM,JVM超详细解析!!!JVM内存模型深度刨析图灵课堂-JVM极简教程(视频)0.是什么JVM是JavaVirtualMachine的缩写,即Java虚拟机。它能够运行编译后的Java字节码,使Java程序具有跨平台的特性。JVM并不会在安装JDK或JRE时自动启动,当......
  • char数组初始化
    原文:https://www.cnblogs.com/cfans1993/p/6404034.html初始化的三种情况:charstr[10]="Hello";charstr[10]={'H','e','l','l','o','\0'};charstr[10]={'H'};charstr[10]={0};charstr......
  • 【白鲸优化算法】 tent、chebyshev、Singer、Logistic、Sine, Circle多种混沌初始化的
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 【白鲸优化算法】 tent、chebyshev、Singer、Logistic、Sine, Circle多种混沌初始化的
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • JVM 参数优化
    1.JVM参数优化1.1.查看JVM默认参数1.2.关键JVM参数1.3.最终参数优化结果1.JVM参数优化1.1.查看JVM默认参数java-XX:+PrintFlagsInitial1.2.关键JVM参数JVM总体上可以分成三类:-:标准参数,比如-verbose:gc这类表示标准实现,所有的虚拟机都需要实......
  • Java JVM——1.JVM与Java体系结构
    前言作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题?✘ 运行着的线上系统突然卡死,系统无法访问,甚至直接OOMM!✘ 想解决线上JVMGC问题,但却无从下手。✘ 新项目上线,对各种JVM参数设置一脸茫然,直接默认吧,然后就JJ了。✘ 每次面......
  • DDR(Double Data Rate)内存技术经历了几个主要的发展阶段,每个阶段都带来了新的技术和性
    DDR(DoubleDataRate)内存技术经历了几个主要的发展阶段,每个阶段都带来了新的技术和性能改进。以下是DDR内存技术的发展阶段:DDR1:DDR1内存于2000年首次推出,它是第一个双倍数据传输速率的内存标准。DDR1内存的数据传输速率是SDRAM的两倍,从而提供了更高的内存带宽和性能。DDR2:DD......