深入解析JVM加载机制

一、背景

Java代码被编译器变成生成Class字节码,但字节码仅是一个特殊的二进制文件,无法直接使用。因此,都需要放到JVM系统中执行,将Class字节码文件放入到JVM的过程,简称类加载

二、整体流程

在这里插入图片描述

三、阶段逻辑分析

3.1 加载Loading

3.1.1 字节码来源

由于类的Class二进制字节码来源可能不同,JVM在此处做了扩展,通过类的全限定名来加载不同来源的二进制字节码文件。以下是一些可能的来源:

  1. 本地文件中获取;
  2. 网络上获取;
  3. 压缩包中获取;
  4. 加密文件中获取;
  5. 运行时内存中获取。例如使用动态代理技术时,进行字节码重组,最终生成的二进制字节流就会在内存获取。

3.1.2 加载步骤

【步骤1】:通过类的全限定名获取类的二进制字节流;
【步骤2】:将二进制字节码中的静态存储结构转化为方法区的运行时数据结构,同时在方法区会生成InstanceKlass对象。下面详细讲解一下字节码文件:
字节码的组成
在这里插入图片描述

一般信息:
1. 魔数
2. 字节码文件对应的Java版本号
3. 访问标识(用于区分类、接口、枚举或注解等类型)
4. 子类、父类和接口的索引,用于找到子类、父类或结构的信息。索引指的在常量池中的位置

在这里插入图片描述

常量池:
1. 字符串常量
2. 类、接口名或字段名
其中的 #数字 即符号引用,表示在常量池中的位置。从图中可以看出,有String_info,Class_info,Methodref_info等信息,字符串常量池仅是其中的一小部分。

在这里插入图片描述

字段:当前类或接口声明的字段信息
方法:当前类或接口声明的方法信息
属性:类的属性

在这里插入图片描述
【步骤3】:在内存【堆中】中生成一个当前类的Class对象,作为访问方法区的入口
在这里插入图片描述

疑问:为什么有了InstanceKlass对象,还需要Class对象
1.InstanceKlass对象是C++语言生成的对象,因此Java代码无法直接操作InstanceKlass对象;
2.Klass对象中不仅包含类的基本信息,还包括虚方法表信息。虚方法表信息是给Java虚拟机使用的,开发者没有权限使用,因此创建一个简单的Class对象,给开发者使用,这样Java虚拟机就能很好的控制开发者访问数据的范围

3.2 链接Linking

3.2.1 验证

文件格式验证、元数据信息验证、字节码正确性验证以及符号引用存在性验证。

3.2.2 准备

  1. static final修饰的基本变量,进行显示初始化赋值。【隐士初始化在编译器阶段已经完成】
  2. static 修饰的变量,分配内存空间,并进行隐士初始化赋值。JDK7放在方法区中,JDK8放在堆中。

3.2.3 解析

编译阶段:由于尚未加载到内存,并不知道实际的内存引用关系,仅是通过特殊方式#数字将具有引用关系的属性记录下来,最终形成符号引用;
运行阶段:各种属性已经被分配过内存空间了,因此它们有实际的内存地址。此时根据符号引用,将属性之间的引用关系转化为内存地址的实际引用关系,最终变成直接引用。

3.3 初始化Init

主要是编译器自动收集类中所有的静态变量以及静态代码块赋值动作,生成<clinit>方法,按照代码赋予的值进行赋值。编译器收集的顺序主要是语句在代码中出现的顺序决定的。
触发类的初始化的几种方式:

1. 访问一个类的```静态变量或静态方法```,但若变量是final修饰且等号右边是常量的,不会触发初始化;
2. 调用Class.forName(String className)方法;
3. 通过new 创建对象;
4. 执行Main方法的当前类

无法触发类的初始化的几种方式:

1. 无静态代码块且无静态赋值语句;
2. 仅有静态变量的声明无赋值操作;
3. 静态变量的定义使用final修饰

父子类的初始化规则:

1. 直接访问父类的静态变量,不会触发子类的初始化;
2. Java虚拟机保证子类的<clinit>方法执行之前,父类的<clinit>一定已经执行完毕,所以父类中的静态变量和静态代码块是优先于子类的静态变量和静态代码块执行的;

3.4 使用和卸载

使用:表示当前类正在被使用
卸载:表示已经被垃圾回收

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/548876.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【推荐系统】NCF神经协同过滤

NCF框架 NCF框架是本文要实现的3个模型的主体结构。 首先是输入层&#xff0c;分别包含两个特征向量 v u v_u vu​和 v i v_i vi​&#xff0c;描述了用户u和物品i。输入仅由一个用户向量和一个物品向量构成&#xff0c;它们分别是以one-hot编码的二值化稀疏向量。 接着是Em…

RocketMQ学习

1.下载安装jdk1.8和rocketmq 下载linux 64位 jdk1.8(自行百度资源) 下载 | RocketMQ (apache.org) ## 解压 tar -zxvf jdk-8u144-linux-x64.tar.gz ## 删除安装包 rm -rf jdk-8u144-linux-x64.tar.gz ##安装jdk环境变量自行百度 解压rocketmq二进制包 ## 解压 unzip rocket…

IT系统可观测性

什么是可观测性 可观测性&#xff08;Observability&#xff09;是指能够从系统的外部输出推断出系统内部状态的能力。在IT和云计算领域&#xff0c;它涉及使用软件工具和实践来收集、关联和分析分布式应用程序以及运行这些应用程序的硬件和网络产生的性能数据流。这样做可以更…

达梦如何备份以及导入

启动达梦服务 右键选择管理服务器 点击系统管理&#xff0c;点击配置&#xff0c;点击转换 归档配置点击归档 创建文件夹&#xff0c;选择文件夹目录点击确定 命令方式 逻辑备份与还原 逻辑导出(dexp)和逻辑导入(dimp)支持如下四种级别操作&#xff1a; 数据库级(FULL)&#…

【人工智能】英文学习材料03(每日一句)

&#x1f33b;个人主页&#xff1a;相洋同学 &#x1f947;学习在于行动、总结和坚持&#xff0c;共勉&#xff01; 目录 Chain Rule (链式法则) Dimensionality Reduction (降维) Long Short-Term Memory (LSTM) (长短期记忆网络) Gradient Explosion (梯度爆炸) Gradie…

线程池详解

线程池详解 一&#xff0c;为什么要用线程池 ① Java的线程模型是基于操作系统的原生线程模型实现的&#xff0c;所以说Java线程实际上是基于内核实现的&#xff0c;创建&#xff0c;析构&#xff0c;同步都需要从用户态切换至内核态&#xff0c;这样带来的性能损耗是很大的。…

数据库事务中“锁”的分类

数据库事务中的锁可以按照不同的维度进行分类。以下是一些常见的分类方式&#xff1a; 1、按锁的粒度分类&#xff1a; 行锁&#xff08;Row-level lock&#xff09;&#xff1a;锁定单个或少量的数据行。这种锁粒度小&#xff0c;允许高度的并发&#xff0c;但管理开销大。页…

《1w实盘and大盘基金预测 day6》

昨日预测完美&#xff0c;点位基本符合&#xff0c;我预测3052&#xff0c;实际最低3055。 走势也符合高平开&#xff0c;冲高回落&#xff0c;再反震荡上涨 大家可以观察我准不准哟&#xff5e;后面有我的一些写笔记、分享的网站。 关注公众号&#xff0c;了解各种理财预测内…

【Windows 常用工具系列 15 -- VMWARE ubuntu 安装教程】

文章目录 安装教程镜像下载 工具安装 安装教程 安装教程参考链接&#xff1a;https://blog.csdn.net/Python_0011/article/details/131619864 https://linux.cn/article-15472-1.html 激活码 VMware 激活码连接&#xff1a;https://www.haozhuangji.com/xtjc/180037874.html…

STM32实验DMA数据搬运小助手

本次实验做的是将一个数组的内容利用DMA数据搬运小助手搬运到另外一个数组中去。 最后的实验结果&#xff1a; 可以看到第四行的数据就都不是0了&#xff0c;成功搬运了过来。 DMA实现搬运的步骤其实不是很复杂&#xff0c;复杂的是结构体参数&#xff1a; 整个步骤为&#xf…

三级等保技术建议书

1信息系统详细设计方案 1.1安全建设需求分析 1.1.1网络结构安全 1.1.2边界安全风险与需求分析 1.1.3运维风险需求分析 1.1.4关键服务器管理风险分析 1.1.5关键服务器用户操作管理风险分析 1.1.6数据库敏感数据运维风险分析 1.1.7“人机”运维操作行为风险综合分析 1.2…

JEDI:变形下分子和周期系统应变分析的通用代码

JEDI&#xff1a;变形下分子和周期系统应变分析的通用代码 拉伸或压缩会引起材料显着的能量、几何和光谱变化。为了在机械或压致变色材料、自修复聚合物和其他机械响应装置的设计中充分利用这些效应&#xff0c;必须详细了解材料中机械应变的分布。在过去的十年中&#xff0c;能…