JVM 加载 Class 文件的原理机制

 Class 文件

     Java中的Class文件是编译后的Java源代码文件,它包含了Java程序的字节码指令,也就是实际的执行代码。Class文件是Java程序的中间文件,可以被Java虚拟机(JVM)加载和执行。在编译Java源代码时,Java编译器将源代码转换为字节码指令,然后将其保存为一个或多个以.class为后缀的Class文件。这些Class文件包含了类、接口、方法、字段等信息,可以被JVM动态加载和执行。

位置

    Java中的Class文件位置可以在文件系统上的任意位置,但是通常有一些约定俗成的规则和最佳实践:

  1. 在编译Java源文件时,默认情况下,Class文件会生成在与源文件相同的目录下。

  2. 如果使用了Java包(package),则编译后的Class文件会生成在与包名相对应的目录结构下。

  3. 在Java项目中,通常会将源文件和Class文件分开存放。源文件通常放在src/main/java或src目录下,而Class文件通常放在target/classes目录下(这是Maven项目中的约定)或bin目录下(这是Eclipse项目中的约定)。这是为了方便项目管理和构建。

  4. 对于Java库文件(JAR文件),通常会将Class文件打包到JAR文件中,并放在lib目录下。

JVM 加载 Class 文件的原理机制

       JVM(Java虚拟机)是用来执行Java程序的运行环境。当JVM执行Java程序时,它需要加载Java类文件并将其转换为可执行代码。

  1. 类装载器(Class Loader): JVM使用类装载器来加载Class文件。类装载器负责查找和加载Class文件到内存中,并生成对应的Class对象。JVM中有三个重要的内置类装载器:

    • Bootstrap Class Loader:也称为引导类装载器,它是JVM的一部分,负责加载核心Java类,如java.lang.*等。
    • Extension Class Loader:也称为扩展类装载器,它负责加载Java扩展库(JAR文件)。
    • Application Class Loader:也称为系统类装载器,它负责加载应用程序的Class文件。
  2. 类路径(Classpath): 类路径是指JVM用来搜索Class文件的路径。它可以是目录、JAR文件或ZIP文件的集合。JVM使用类路径来确定从哪里加载Class文件。类路径可以通过设置系统环境变量(CLASSPATH),或在命令行参数中指定。

  3. 类加载过程: 类加载器按照以下顺序加载Class文件:

    • 类加载器首先检查Class文件是否已经被加载过,如果是,则直接返回对应的Class对象。
    • 如果Class文件没有被加载过,类加载器会从指定的类路径中查找该Class文件。
    • 类加载器读取Class文件的二进制数据,并根据文件中的内容创建一个Class对象。
    • 在创建Class对象之前,类加载器会检查Class文件的正确性,包括校验文件的魔数、版本号等。
    • 类加载器将加载好的Class对象存放在内存中的方法区(Method Area)中,并返回对应的Class对象的引用。
  4. 类初始化: 一旦Class对象被加载到内存中,JVM会对该Class对象进行初始化。在初始化阶段,JVM会执行以下操作:

    • 执行静态变量的初始化,包括赋值和静态代码块的执行。
    • 执行静态方法。
  5. 类加载器的层次结构: 类加载器采用了层次结构的组织方式,称为双亲委派模型。根据这个模型,类加载器首先将类的加载请求委派给父类加载器进行处理,如果父类加载器无法加载该类,再由子类加载器尝试加载。这样可以确保类的加载是一层一层向上的,避免重复加载和冲突。

     JVM加载Class文件的过程可以简述为类装载器根据类路径查找并加载Class文件,然后将其转换为Class对象,并进行初始化操作。类加载器采用了双亲委派模型,确保类的加载顺序和一致性。

总结

      JVM(Java虚拟机)加载Class文件的过程分为三个步骤:加载、连接和初始化。下面是对这三个步骤的详细总结:

  1. 加载: 加载是指将Class文件中的二进制数据读取到内存中,并将其转换为方法区中的运行时数据结构。加载阶段主要完成以下几个任务:

    • 通过类的全限定名查找并定位到类的二进制数据文件。
    • 将类的二进制数据文件读入到内存中。
    • 将类的二进制数据转化为方法区中的运行时数据结构,包括类的常量池、字段和方法信息、类的访问标志等。
  2. 连接: 连接是将已经加载到内存中的类的二进制数据进行验证、准备和解析的过程。连接阶段主要完成以下几个任务:

    • 验证:对加载过程中的字节码进行合法性校验,包括检查字节码的结构、语义和指令的合法性等。
    • 准备:为类的静态字段分配内存并设置默认初始值。
    • 解析:将符号引用转换为直接引用,解析过程中主要涉及到类、接口、字段和方法的解析。
  3. 初始化: 初始化是类加载过程的最后一步,主要是执行类的初始化方法(<clinit>方法)。初始化阶段主要完成以下几个任务:

    • 设置类的初始化状态为"初始化中"。
    • 执行类的<clinit>方法,该方法由编译器自动生成,包含了类的静态字段的赋值和静态代码块的执行等。
    • 设置类的初始化状态为"已初始化"。

      在JVM内部,有一个内存区域叫做方法区(Metaspace)用于存储类的运行时数据结构,包括类的常量池、字段和方法信息、类的访问标志等。当JVM加载Class文件时,会将其转换为方法区中的运行时数据结构。在连接阶段,对已经加载的类进行验证、准备和解析操作。最后,在初始化阶段执行类的初始化方法,完成类的初始化过程。

      JVM通过这一系列的步骤,将Class文件转化为可执行的代码,并将其加载到内存中供程序运行使用。这样,Java程序就可以通过JVM运行在不同的操作系统和硬件平台上,实现了"一次编写,到处运行"的特性。

     

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

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

相关文章

探究NVMe SSD HMB应用场景与影响-<续>

如果需要采用HMB功能,需要SSD支持NVME协议且NVMe 1.2及以上版本。NVME协议中对HMB对应有2个关键参数: HMB建议值(HMPRE):设定实际分配给HMB使用的主机内存容量,为设备提供最优性能的内存分配量。 HMB最小值…

双星号(**)和单星号(*)在Python参数传递中的妙用

在Python中,参数传递是一个非常重要的概念,它允许函数接收任意数量的参数。而双星号(**)和单星号(*)在参数传递中扮演着关键角色。本文将详细讲解这两个符号的用法,并通过示例代码帮助初学者理解它们的工作原理。 单星号(*) 单星号(*)用于函…

EPS软件标注点坐标值

1、如下,点击右侧(尺寸标注)按钮: 2、弹出一个对话框,如下: 3、在上图对话框中设置好箭头样式和小数位数,然后点击图上一点,右击结束再鼠标指定位置,如下: 如…

CV每日论文--2024.5.10

1、Attention-Driven Training-Free Efficiency Enhancement of Diffusion Models 中文标题:扩散模型的注意力驱动的训练免费效率增强 简介:扩散模型在生成高质量和多样化图像方面取得了出色的表现,但其卓越性能是以昂贵的架构设计为代价的,特别是广泛使…

数据库——SQL SERVER(先学删库跑路)

目录 一:什么是数据库 二:为什么需要数据库 三:数据库的安装 四:学前必备知识 1. 数据库原理 2. 数据库与编程语言 3. 数据库与数据结构的区别 4. 连接 5. 有了编程语言为啥还要数据库 6. 初学者学习数据库的三个方面 …

mplab ide中使用c语言编程,PIC单片机的C语言使用——在MPLAB-IDE中使用HitechC编译器.doc...

mplab ide中使用c语言编程,PIC单片机的C语言使用——在MPLAB-IDE中使用HitechC编译器.doc...-CSDN博客

高校推免报名|基于SSM+vue的高校推免报名系统的设计与实现(源码+数据库+文档)

高校推免报名 目录 基于SSM+vue的高校推免报名的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2后台登录模块 5.2.1管理员功能模块 5.2.2考生功能模版 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八…

放大招:NLP-探索深度学习在自然语言处理中的应用:构建标题生成器

引言 在深度学习的领域中,自然语言处理(NLP)是一个令人兴奋且快速发展的分支。它使得机器能够理解、解释和生成人类语言。在本博客中,我们将通过构建一个简单的标题生成器来探索NLP的基础知识,了解如何使用深度学习模…

【学习笔记】人群归因分数 PAF 以及combined PAF(更新)

在此推荐2篇发表在lancet以及jama子刊上的paf文章,这两篇文章套路是一样的,只是在不同国家进行。 在计算combined PAF或者说weighted PAF的时候,先建立了相关矩阵,再做主成分分析,得到communality。详细信息大家可翻阅…

【Pytest官方文档翻译及学习】1.1 安装和入门

目录 1.1 安装和入门 1.1.1 安装pytest 1.1.2 创建第一个测试 1.1.3 运行多个测试 1.1.4 断言引发了某个异常 1.1.5 将多个测试分组在一个类中 1.1.6 请求功能测试的唯一临时目录 1.1.7 继续阅读 Pytest是一个成熟的全功能的Python测试框架,它可以满足大多数…

huffman编码【python】【算法】

哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。该方法完全依据字符出现概率来构造整体平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(…

MFC/QT利用COM组件接口从字体名称、粗体、斜体获取到字体文件路径的方法

MFC/QT利用COM组件接口从字体名称、粗体、斜体获取到字体文件路径的方法 这个是目前唯一能准确从字体名称加粗斜体三个属性定位到ttf/ttc字体路径的方法,其他的方式是没有办法区分后两个属性而且会出现不准确的问题 之前无意间在MSDN找到的资料: IDWr…

el-calendar自定义日程,显示文字内容,el-date-picker和el-calendar互动互联

Vue实现 el-calendar自定义日程,显示文字内容,el-date-picker和el-calendar互动互联 效果展示 首先el-calendar需要自定义日程内容的话,其格式一般必须满足如下结构 dataList = [{date: 2024-05-08, content: "数学模拟试卷(3)"},{date: 2024-05-08, content: …

【STM32 |程序实例】按键控制、光敏传感器控制蜂鸣器

目录 前言 按键控制LED 光敏传感器控制蜂鸣器 前言 上拉输入:若GPIO引脚配置为上拉输入模式,在默认情况下(GPIO引脚无输入),读取的GPIO引脚数据为1,即高电平。 下拉输入:若GPIO引脚配置为下…

C语言(指针)6

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注收藏,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记&#x…

深度学习之神经网络理论基础

深度学习之神经网络理论基础 人工神经元 人工神经元:人类神经元中抽象出来的数学模型 MP模型 mp模型:1943年心理学家W.S.McCulloch和数理逻辑学家W.Pitts研究出人工神经元,称为M-P模型。 M-P神经元(一个用来模拟生物行为的数学模…

.NET开源、功能强大、跨平台的图表库LiveChart2

LiveCharts2 是 从LiveCharts演变而来,它修复了其前身的主要设计问题,它专注于在任何地方运行,提高了灵活性,并继承LiveCharts原有功能。 极其灵活的数据展示图库 (效果图) 开始使用 Live charts 是 .Net 的跨平台图表库,请访问 https://livecharts.dev 并查看目标平…

React 基础案例

React的特点&#xff1a; 1、声明式编程 2、组件化开发 3、多平台适配yuan 原生实现&#xff1a; <h2 class"title"></h2><button class"btn">改变文本</button><script>let msg "Hello World";const titleEl d…

P6397 [COI2008] GLASNICI

题目描述 一条直线上有 &#x1d45b; 个信使&#xff0c;将他们按照从左至右的顺序以 1 至 &#x1d45b; 编号。换句话说&#xff0c;设 &#x1d456; 号信使的的坐标为 &#x1d451;&#x1d456;​&#xff0c;则对于 1≤&#x1d456;<&#x1d45b;&#xff0c; &am…

TCP协议建立连接的过程及其意义

目录 三次握手 四次挥手 三次握手的意义 在客户端与服务器传输数据之前&#xff0c;要在两台主机之间先建立连接&#xff0c;然后再传输业务数据。三次握手&#xff0c;就是建立连接的过程&#xff0c;是在传输业务之前&#xff0c;就要先进行。握手好了&#xff0c;才能进行…