JVM-类加载过程

news2024/11/23 10:10:02

类加载过程是 Java 虚拟机 (JVM) 将 Java 代码编译后的字节码文件加载到内存中,并进行解析和验证,最终使程序能够运行的关键步骤。

  • 类加载过程:加载->连接->初始化
  • 连接过程又可分为三步:验证->准备->解析

6b6eb92afdf148ddb225cf62a9b7e9ef.png

1. 加载(Loading)

将字节码文件读入内存,并将其转换为 JVM 能够识别的 Class 对象。

这个过程通常涉及以下几个步骤:

  • 查找:JVM根据类的全名(包括包名)查找相应的字节码文件(.class文件)。这可以从本地文件系统、网络或其他资源中获取。
  • 读取:找到字节码文件后,JVM会将其读取到内存中。
  • 解析:将字节码中的符号引用(如类名、方法名、字段名等)转换为直接引用。这一过程通常在后续步骤中进行。

 

2.验证 (Verification)

检查字节码文件的合法性和安全性,确保其符合 JVM 规范,防止恶意代码攻击。

  • 文件格式验证:检查字节码文件的格式是否正确。
  • 字节码验证:确保字节码符合Java语言的语法和语义规则,例如,确保方法的调用和字段的访问是合法的。
  • 类型验证:检查类的继承关系和类型兼容性,确保类型安全。

 

3. 准备(Preparation)

在准备阶段,JVM会为类的静态变量分配内存,并将其初始化为默认值(如0、null等)。此时,类的静态变量会被分配到方法区(Method Area)。

 

4. 解析(Resolution)

解析(Resolution)是将符号引用转换为直接引用的过程。

主要是将字节码中的符号引用(如类名、方法名和字段名)转换为在内存中实际指向这些元素的地址。这一过程确保了在运行时能够正确地访问和调用类、方法和字段。

 

符号引用和直接引用

  • 符号引用
    • 符号引用是指在字节码中以字符串形式表示的类、方法或字段的名称。
    • 例如,类B的符号引用可能是字符串"B",而方法display的符号引用可能是字符串"display"。
  • 直接引用
    • 直接引用是指在内存中实际的地址或指针,指向类、方法或字段的具体实现。直接引用允许JVM快速访问这些元素,而无需再次查找。

示例

class A {
    void methodB() {
        B b = new B();  // 这里需要解析B类
        b.display();    // 这里需要解析display方法
    }
}

class B {
    void display() {
        System.out.println("Hello from B");
    }
}
  • methodB被调用时,JVM首先会解析类B,找到它在内存中的地址。
  • 然后,在调用b.display()时,JVM会解析display方法,找到该方法在内存中的地址。

 

5. 初始化(Initialization)

初始化阶段是类加载过程的最后一步。在这一阶段,JVM会执行类的初始化代码,包括静态变量的初始化和静态代码块的执行。初始化过程遵循以下规则:

  • 静态变量初始化:根据在类中定义的顺序,初始化所有静态变量。
  • 静态代码块执行:执行类中的所有静态代码块。

 

6. 使用(Using)

类加载完成后,JVM可以使用该类进行实例化、方法调用等操作。此时,类的生命周期开始,JVM可以根据需要创建类的实例并调用其方法。

 

7. 卸载(Unloading)

在某些情况下,当类不再被使用时,JVM会将其从内存中卸载。卸载过程通常由垃圾回收机制管理,以释放内存资源。

卸载类需要满足 3 个要求:

  1. 该类的所有的实例对象都已被 GC,也就是说堆不存在该类的实例对象。
  2. 该类没有在其他任何地方被引用
  3. 该类的类加载器的实例已被 GC

所以,在 JVM 生命周期内,由 jvm 自带的类加载器加载的类是不会被卸载的。但是由我们自定义的类加载器加载的类是可能被卸载的。

 

参考:类加载过程详解 | JavaGuide

 

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

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

相关文章

Vitis AI 基本认知(Tiny-VGG 标签获取+预测后处理)

目录 1. 简介 2. 解析 2.1 获取标签 2.1.1 载入数据集 2.1.2 标签-Index 2.1.3 保存和读取类别标签 2.2 读取单个图片 2.3 载入模型并推理 2.3.1 tiny-vgg 模型结构 2.3.2 运行推理 2.4 置信度柱状图 2.5 预测标签 3. 完整代码 4. 总结 1. 简介 本博文在《Vitis …

Python酷库之旅-第三方库Pandas(105)

目录 一、用法精讲 456、pandas.DataFrame.rdiv方法 456-1、语法 456-2、参数 456-3、功能 456-4、返回值 456-5、说明 456-6、用法 456-6-1、数据准备 456-6-2、代码示例 456-6-3、结果输出 457、pandas.DataFrame.rtruediv方法 457-1、语法 457-2、参数 457-3…

云计算实训38——docker网络、跨主机容器之间的通讯

一、docker⽹络 1.桥接--bridge 所有容器连接到桥就可以使⽤外⽹,使⽤nat让容器可以访问外⽹ 使⽤ ip a s指令查看桥,所有容器连接到此桥,ip地址都是 172.17.0.0/16 ⽹段,桥是启动docker服务后出现,在centos使⽤ br…

centos安装mysql8.0版本,并且实现远程连接

一、 卸载mysql 查看mysql安装情况 rpm -qa | grep -i mysql 删除上图中所有信息 rpm -ev mysql-community-release-el7-5.noarch --nodeps 再次查询,没有数据,则为删除干净 find / -name mysql rm -rf /var/lib/mysql 将机器上的所有mysql相关文…

一篇文章带你真正了解接口测试(附视频教程+面试真题)

一、什么是接口测试? 所谓接口,是指同一个系统中模块与模块间的数据传递接口、前后端交互、跨系统跨平台跨数据库的对接。而接口测试,则是通过接口的不同情况下的输入,去对比输出,看看是否满足接口规范所规定的功能、…

79.位域

目录 一.位域的概念 二.语法格式 三.无名位域 四.视频教程 一.位域的概念 有些数据在存储的时候并不需要一个完整的字节。比如使用一个变量表示开关的状态,开关只有开和关俩个状态,所以只需要使用0和1表示,也就是一个二进制位。所以这时候…

前端提升之——chrome浏览器插件开发指南——chrome插件介绍及入门

前言 有一天突发奇想,想要自己写一个浏览器插件玩一玩,并不做用于商业或者其他方面,仅仅用于自我技术的练习和提升。 这里的浏览器我选择Chrome,当然chrome插件同样适用于微软自带的 Microsoft Edge 在当今发达的互联网环境下&…

云微客短视频矩阵如何打造多元化的视频内容呢?

随着抖音、快手等平台的兴起,短视频已经成为了人们日常生活的一部分,也有不少企业通过短视频赛道实现了品牌曝光和获客引流,但是单一的视频内容终究很难长久的吸引用户,所以如何打造多元化的视频内容呢? 在这个快节奏的…

【二叉树】OJ题目

🌟个人主页:落叶 目录 单值⼆叉树 【单值二叉树】代码 相同的树 【相同二叉树】代码 对称⼆叉树 【对称二叉树】代码 另一颗树的子树 【另一颗树的子树】代码 二叉树的前序遍历 【二叉树前序遍历】代码 二叉树的中序遍历 【二叉树中序遍历】…

【数据结构】栈和队列相互实现

目录 栈实现队列 思路 入队列 出队列 获取队头元素 队列实现栈 思路 入栈 出栈 获取栈顶元素 完整代码 栈实现队列 队列实现栈 栈实现队列 思路 栈的特点是 先进后出, 队列的特点是 先进新出,这就意味着我们无法通过一个栈来实现队列&…

YOLOv5改进 | 融合改进 | C3融合Efficient Multi-Scale Conv Plus【完整代码】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录: 《YOLOv5入门 改…

生成式AI扩散模型-Diffusion Model【李宏毅2023】概念讲解、原理剖析笔记

目录 一、Diffusion的基本概念和运作方法 1.Diffusion Model是如何运作的? 2.Denoise模块内部正在做的事情 如何训练Noise predictor? 1)Forward Process (Diffusion Process) 2)noise predictor 3.Text-to-Image 4.两个A…

MySQL必会知识精华3(使用MySQL)

我们的目标是:按照这一套资料学习下来,大家可以完成数据库增删改查的实际操作。轻松应对面试或者笔试题中MySQL相关题目 上篇文章我们先做一下数据库的基础知识以及MySQL的简单介绍。本篇文章主要连接使用MySQL的相关知识。相对简单,争取做到…

Datawhle X 李宏毅苹果书AI夏令营深度学习笔记之——局部最小值与鞍点

深度学习中优化神经网络是一个重要的问题,我们经常沮丧地发现到了一个节点,不管参数怎么更新,训练的损失都不会下降,神经网络似乎训练不起来了。这可能和损失函数收敛在局部最小值与鞍点有关。 一、 局部最小值(local…

‌蜘蛛的工作原理及蜘蛛池的搭建与优化

蜘蛛的工作原理主要包括跟踪网页链接、‌采用一定的爬行策略遍历互联网,‌以及将新内容添加到引擎的索引中。‌具体来说:‌ 跟踪网页链接‌:‌蜘蛛会从一个或多个初始URL开始,‌通过这些URL发现新的链接,‌并将这些链接…

数据的基本类型

数据的基本类型 字符串 切片 切片语法: strs "hello" strs[0:]整数型 浮点型 布尔类型

vscode c++和cuda开发环境配置

文章目录 1. vscode 插件安装2. 开发环境配置2.1 bear 安装2.2 代码的编译2.2.1 编写Makefile文件2.2.2 bear make和make命令2.3 debug环境配置2.1 函数跳转设置2.1.1 ` c_cpp_properties.json` 设置2.1.2 settings.json设置2.2 调试环境配置2.2.1 tasks.json2.2.2 launch.json…

【C语言进阶】C语言指针进阶实战:优化与难题解析

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C语言 “ 登神长阶 ” 🤡往期回顾🤡:C语言指针进阶 (上) 🌹🌹期待您的关注 🌹🌹 ❀C语言指针进阶 &#x…

Java常用API(BigInteger)

在Java中,整数有四种类型:byte,short,int,long 在底层占用字节个数:byte 1个字节,short2个字节,int 4个字节,long 8个字节 对象一旦创建,里面的值是不能改变…

Go wv(WebView2) GUI框架介绍和使用

说明 wv(webview2) 是Go语言基于LCL和WebView2基础上封装的框架,用于开发Windows GUI软件。 介绍 LCL(Lazarus Component Library) :跨平台原生UI组件库. wv(WebView2): Microsoft Edge WebView2 控件允许在本机应用中嵌入 web 技术(HTML、CSS 以及 …