对 JVM 的类加载机制以及寻找字节码文件的“双亲委派模型”的理解

目录

1、JVM 的类加载机制

1.1、加载

1.2、验证

1.3、准备

1.4、解析

1.5、初始化

2、双亲委派模型

2.1、工作过程 



 

1、JVM 的类加载机制

类加载指的是 Java 进程运行的时候,需要把 .class 文件从硬盘读取到内存,并进行一系列的校验解析的过程。
类加载的过程其实就是 .class 字节码文件转成 类对象 的过程,本质上也是数据从硬盘内存的过程。

类加载大体的过程分为 5 个步骤(也有资料说 3 个,其实就是将 2,3,4 合并成 1 个):

1.1、加载

找到硬盘上的 .class 文件(使用双亲委派模型,下文将讲解),打开文件并读取文件内容(认为读到的是二进程数据)。

1.2、验证

验证当前读到的文件内容合法的 .class 字节码文件格式,保证这些信息被当作代码运行后不会危害虚拟机自身的安全。具体的验证依据根据,在 Java 的虚拟机规范中有明确的格式说明。

虚拟机规范中的部分截图

1.3、准备

给类对象申请内存空间,此时申请到的内存空间都是默认值全0。

1.4、解析

解释阶段主要是针对类中的字符串常量进行处理,Java 虚拟机将常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程。

private String s = "hello";

上述代码中很显然,s 变量相当于保存了“hello”字符串常量的地址,但是在文件中,不存在“地址”的概念,地址是“内存”的地址,因此在硬盘的文件中使用类似地址的“偏移量”来表示

而文件中给 s 填充的“hello”偏移量就可以认为是“符号引用”

接下来将 .class 文件加载到内存后,会将字符串加载到内存中,此时“hello”就有地址了,就可以将当前“hello”真实的地址替换“偏移量”,称为“直接引用”

1.5、初始化

针对类对象完成后续的初始化,还要执行静态代码块的逻辑,还可能触发父类的加载。

2、双亲委派模型

上述1.1、加载步骤中提到了要先从硬盘上找到 .class 文件,那么如何找呢?此时就需要使用到“双亲委派模型”,JVM 中有一个专门的模块“类加载器”(ClassLoader)来进行类加载的操作,即通过带有包名的类名(如 java.lang.String)来找到对应的 .class 文件

JVM 中的 “类加载器” 默认有三个:

1、BootstrapClassLoader

负责查找标准库的目录。

2、ExtensionClassLoader

负责查找扩展库的目录。Java 语法规范里面描述了标准库中应该有哪些功能,但是实现 JVM 的厂商/组织也会在标准库的基础上扩充一些额外的功能库(不同厂商实现的 JVM 也可能有所不同)。

3、ApplicationClassLoader

负责查找当前项目的代码目录,以及第三方库的目录。

2.1、工作过程 

1、从 applicationclassloader 作为入口,先开始工作。applicationclassloader不会立即搜索自己负责的目录,会把搜索的任务交给自己的父亲 extensionclassloader。

2、此时代码就进入到 extensionclassloader 范畴了,extensionclassloader也不会立即搜索自己负责的目录,也要把搜索的任务交给自己的父亲 bootstrapclassloader。

3、bootstrapclassloader 发现自己没有父亲,才会真正搜索负责的标准库目录,通过全限定类名,尝试在标志库中找到符合要求的 .class 文件,如果找到了,接下来就直接进入到打开文件/读文件等流程中,如果没找到则会返回到 extensionclassloader ,继续尝试加载,依此类推。

4、如果最后走到 applicationclassloader 依然没找到,此时说明类加载过程失败,就会抛出 classnotfoundexception 异常

【博主推荐】 

【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/136322678?spm=1001.2014.3001.5501【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/136288256?spm=1001.2014.3001.5501【Java多线程】对线程池的理解并模拟实现线程池-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/136160003?spm=1001.2014.3001.5501

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑蓝牙在哪里打开?不同系统详解

在现代计算机的多功能性中,蓝牙技术的广泛应用使得我们能够轻松连接各种外部设备,实现无线传输和分享。无论是连接无线耳机、键盘,还是与其他设备快速交换文件,蓝牙在电脑中的角色很重要。然而,对于一些用户而言&#…

【小白学机器学习5】评价预测值和观测值差异的指标:MSE, RMSE,MAE, MAPE, WMAPE

目录 1 评价误差的各种度量指标 2 从误差的评价开始捋这个问题 2.1 误差问题的由来:回归模型预测值和真实值的差距 2.2 如何评价某函数的预测值是否足够好? 如何比较不同的预测函数的预测值的好坏呢? 2.3 最小二乘法:应该叫最…

Linux-网络-011

1网络协议模型 1.1【OSI】协议模型 1.1.1应用层 实际发送的数据应用层:HTTP 超文本传输协议HTTPS FTP 文件传输协议TFTP 简单文本传输协议SMTP 邮件传输协议MQTT TELNET ..1.1.2表示层 发送的数据是否加密1.1.3会话层 是否建立会话连接1.1.4传输层 数据…

STM32各外设初始化步骤

1、GPIO初始化步骤 1、使能GPIO时钟 2、初始化GPIO的输入/输出模式 3、设置GPIO的输出值或获取GPIO的输入值 GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin…

chrome插件chrome.storage数据写入失败QUOTA_BYTES_PER_ITEM quota exceeded

Unchecked runtime.lastError while running storage.set: QUOTA_BYTES_PER_ITEM quota exceeded at Object.callback 在开发浏览器插件的时候,报错提示:超出存储限制,浏览器插件存储官方文档:https://developer.chrome.com/docs…

【数据结构】21 Trie字符串统计

Trie 树 Trie树又称字典树、单词查找树。是一种能够高效存储和查找字符串集合的数据结构。 插入字符串 对上面已知的tire树,假如插入一个字符串"abdf",需要进行以下操作: 从字符a开始寻找: 从第一层开始p 0 ,s[p][a…

Datadog平台各服务简介

AIOps的核心是AI,所以训练一个AI是实现AIOps的首要任务。 Datadog平台服务简介 Datadog 是一个云监控平台,提供了多种服务来帮助用户监控、分析、优化和保护他们的应用程序、基础设施、网络和安全。以下是每个服务的简要介绍: INFRASTRUCTU…

[C#]winform基于C2PNet算法实现室内和室外图像去雾

【CP2Net框架】 https://github.com/YuZheng9/C2PNet 【CP2Net介绍】 Abstract 考虑到不适定的性质,发展了单图像去模糊的对比正则化,引入了来自负图像的信息作为下界。然而,对比样本是非一致的,因为阴性通常距离清晰&#xff…

中国制造赢得世界 外贸独立站wordpress建站案例

孵化器wordpress外贸主题 孵化器、孵化设备wordpress企业主题,适合做孵化器 、孵化设备的企业使用。 https://www.jianzhanpress.com/?p3478 橡胶制品wordpress外贸主题 橡胶制品wordpress外贸主题,橡塑产品对外贸易公司官方网站wordpress模板。 ht…

ServletContext

ServletContext 1.共享数据 ServletContext servletContext this.getServletContext(); String username "徐凤年"; servletContext.setAttribute("username",username);ServletContext servletContext this.getServletContext(); String username (…

Subversion svn 开源的版本控制系统入门介绍 VCS

拓展阅读 Subversion 开源的版本控制系统入门介绍 VCS Git 开源的版本控制系统-01-入门使用介绍 Git 开源的版本控制系统-02-base usage 基本用法 Git 开源的版本控制系统-03-时间数据回溯 Git 开源的版本控制系统-04-branch manage 分支管理 Git 开源的版本控制系统-05-…

软考-中级-系统集成2023年综合知识(六)

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 软考中级专栏回顾 专栏导航描述软考-中级系统集成2023年综合知识(一)软考-中级系统集成2023年综合知识(二)软…

泛微OA本地部署项目

泛微OA本地部署 本文演示脱离公司服务器,在本地搭建泛微 OA。 本次演示的版本如下: ecology:e-9sql server 版本:2012jdk 版本:1.8 一、安装 VmWare、Centos 7 对于 VmWare、Centos 7的安装,此处不再一一…

[LeetBook]【学习日记】有效数字——状态机

题目 有效数字 有效数字(按顺序)可以分成以下几个部分: 若干空格一个小数或者整数(可选)一个’e’或’E’,后面跟着一个整数若干空格 小数(按顺序)可以分成以下几个部分&#xff1a…

微信小程序python+uniapp+hbuiderx宠物美容用品商城领养寄养系统i843n

宠物中心信息管理系统app是在安卓操作系统下的应用平台。为防止出现兼容性及稳定性问题,编辑器选择的是Hbuildex,安卓APP与后台服务端之间的数据存储主要通过MySQL。用户在使用应用时产生的数据通过 python等语言传递给数据库。通过此方式促进宠物中心信…

JS实现chatgpt数据流式回复效果

最近高了一个简单chatgpt对话功功能,回复时希望流式回复,而不是直接显示结果,其实很简单,前端流式读取即可,后端SSE实现流式传输 前端用到fetch获取数据,然后利用reader读取 let requestId parseInt(Ma…

flink重温笔记(十一):Flink 高级 API 开发——flink 四大基石之 Checkpoint(详解存储后端)

Flink学习笔记 前言:今天是学习 flink 的第 11 天啦!学习了 flink 四大基石之 Checkpoint (检查点),主要是解决大数据领域持久化中间结果数据,以及取消任务,下次启动人可以恢复累加数据问题&…

STC89C52串口通信详解

目录 前言 一.通信基本原理 1.1串行通信与并行通信 1.2同步通信和异步通信 1.2.1异步通信 1.2.2同步通信 1.3单工、半双工与全双工通信 1.4通信速率 二.串口通信简介 2.1接口标准 2.2串口内部结构 2.3串口相关寄存器 三.串口工作方式 四.波特率计算 五.串口初始化步骤 六.实验…

centos7中python3.10找不到openssl解决方案

如果有用其他方法安装了其他版本openssl,记得卸载其他的openssl,删除其他的openssl相关文件。 yum remove openssl* rm -rf ***下载最新版的openssl文件 按照官网安装方法安装openssl 官方安装地址https://docs.python.org/3/using/unix.html#on-linu…

平台工程指南:从架构构建到职责分工

平台工程只是 DevOps 专业化的另一个术语,还是另有所指?事实可能介于两者之间。DevOps 及其相关的 DevXOps 有着浓厚的文化色彩,以各个团队为中心。不幸的是,在许多地方,DevOps 引发了新的问题,如工具激增和…