当前位置: 首页 > article >正文

JVM类加载全过程

Java虚拟机类加载的全过程,即加载,验证,准备,解析,初始化

一、加载

加载 是 类加载过程中的一个阶段, 有以下三部分组成

1)通过一个类的全限定名来获取定义此类的二进制流

2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

3)在堆中生成一个代表这个类的Java.lang.class对象,作为程序访问 2) 方法区中这个类的各种数据的接口

二、验证

验证是连接的第一步,这一阶段的目的是确保Class文件的字节流中包含的信息符合《Java虚拟机规范》

因为class不一定有Java编译出来,用0,1敲出class文件也可以的,这会危害虚拟机,所以必须检验。

三、准备

准备阶段是正式为类中定义的变量,即静态变量,被static修饰的变量; 分配内存并设置类变量初始值的阶段。

首先颠覆三观一下,很多资料都说静态变量存储在方法区,但实际上在JDK7之后,静态变量会随着class对象一起存放在Java堆中。 

强调一点: 实例变量不会分配内存, 实例变量会在对象实例化时随着对象一起分配在Java堆中。

        这个时候只记录一个域信息

其次分配完之后初始值通常是数据类型的零值。

public static int value = 123;

这个变量在准备阶段过后的初始值是0而不是123,因为这时尚未开始执行任何Java方法,而把value赋值为123的putstatic指令是程序被编译后,存放于类构造器<clinit>()方法中,所以把value赋值为123的动作要到类的初始化阶段才会被执行。注意:此时依然没有实例变量啥事。

还有一种情况:

public static final int value = 123;

编译时Javac将会为value生成ConstantValue属性,在准备阶段虚拟机就会根据ConstantValue的设置将value赋值为123。

四、解析

解析阶段是Java虚拟机将常量池内的符号引用替换为直接引用的过程

符号引用:一组符号描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可

直接引用: 可以是直接指向目标的指针,相对偏移量这些精确定位到内存的引用。跟内存相关很大。

五、初始化

类的初始化阶段是类加载过程的最后一个步骤,

初始化阶段就是执行类构造器<clinit>()方法的过程。

(1)<clinit>()方法是由编译器自动收集类中的所有静态变量和静态语句块(static{ }块)中的语句合并而成的。编译器收集的顺序是由语句在源文件中出现的顺序决定,静态语句块只能访问到定义在静态语句块之前的变量,定义在他之后的变量,在前面的静态语句块可以赋值,但不能访问。

(2)<clinit>()方法与类的构造函数(虚拟机视角的实例构造器<init>())不同,它不需要显示调用父类的构造器,Java虚拟机会保证子类的<clinit>()方法执行前,父类的<clinit>()方法已经执行完毕。

(3)父类先执行也意味着父类中定义的静态语句块要优先于子类的变量赋值操作。

(4)<clinit>()方法不是必须的,如果类没有静态语句块,或者需要为变量赋值的操作,编译器可以不为这个类生成<clinit>()方法。

以上具体例子参考《深入理解JAVA虚拟机》


http://www.kler.cn/news/157572.html

相关文章:

  • 2023-2024-1-高级语言程序设计-第2次月考函数题
  • 【C语言】预处理详解
  • js获取当前时间,当日零点,前一周时间
  • Web测试自动化工具Selenium的使用
  • Java中熟练掌握BigDecimal运用-工具类
  • netcore swagger 错误 Failed to load API definition
  • 【开源】基于Vue+SpringBoot的康复中心管理系统
  • 【Unity动画】Unity 动画播放的流程
  • Python处理Point, MultiPolygon, Polygon, LineString等Geo地理形状数据
  • 根据已有安装的cuda配置合适的pytorch环境
  • vue:ESLint如何自动修复代码
  • IntelliJ IDEA的下载安装配置步骤详解
  • 开源堡垒机Jumpserver
  • 人工智能|网络爬虫——用Python爬取电影数据并可视化分析
  • 记录33333
  • 大数据项目——基于Django协同过滤算法的房源可视化分析推荐系统的设计与实现
  • 图像万物分割——Segment Anything算法解析与模型推理
  • 【NGINX--12】性能调优
  • WPF halcon 机器视觉
  • 【安卓】安卓xTS之Media模块 学习笔记(1) xTS介绍
  • C语言小游戏:三子棋
  • MATLAB算法实战应用案例精讲-【数模应用】机器学习-聚类算法
  • 【物联网】Node-RED
  • 目标检测YOLO实战应用案例100讲-基于深度学习的输电线路 鸟巢检测
  • 创建conan包-打包现有二进制文件
  • CeresPCL 拟合椭圆(2D)
  • 问题:HTTP method names must be tokens
  • Ubuntu显卡及内核更新问题
  • freeRTOS创建任务
  • rust入门(rust教程、rust安装方法)