JVM类加载基本流程及双亲委派模型

1.JVM内存区域划分

一个运行起来的Java进程就是一个JVM虚拟机,这就需要从操作系统中申请一片内存区域。JVM申请到内存之后,会把这个内存划分为几个区域,每个区域都有各自的作用。

一般会把内存划分为四个区域方法区(也称 "元数据区"),堆区栈区程序计数器

(1)方法区:存储的内容是 "类对象"

(2)堆区:new()出来的对象就存储在堆区。

(3)栈区:存储的内容一般是 一些 方法的形参,方法的返回值,局部变量

(4)程序计数器:程序计数器中存放的是接下来要执行的指令的地址

一个示例代码,看看每个变量存放在内存的哪个区域:

name是"static成员",是"静态变量",也就是"类成员",因此 该变量在 方法区

age是"成员变量",new 出来的对象就会包含age这个属性,因此age变量在 堆区

demo是"局部变量",是一个 "引用类型" 的变量,存放的是 对象的地址。通过demo变量能够找到Demo对象。因此,demo存储在 栈区

                                        

2.JVM类加载的基本流程

我们编写的Java代码会被编译成.class文件,一个Java程序想要运行起来,就得找到.calss文件,把.class文件中的内容 构造成 "类对象",保存到内存的方法区中。以上过程就是类加载的过程。

类加载的过程可以分成5个步骤:加载验证准备解析初始化

(1)加载:找到.class文件,打开文件 并读取文件的内容。

(2)验证:.class文件是一个二进制文件,需要验证当前读取的格式是否符合要求。

(3)准备:给类对象分配内存空间

(4)解析:针对类对象中包含的字符串常量进行处理,进行一些初始化操作。

(5)初始化:对 类对象进行初始化,把类对象中的各个属性都设置好。以及涉及到的static成员,静态代码块等。

3.双亲委派模型

双亲委派模型 属于类加载流程中的第一步,也就是 "加载"过程所涉及到的。这个模型 会根据 全限定类名 找.class文件。

JVM内置了三个 类加载器,分别为 BootStrap ClassLoader(爷)、Extension ClassLoader(父)、Application ClassLoader(子)。

在找.class文件时,会根据类的全限定类名,形如"java.lang.String",从类加载器中寻找该类。

(1)首先,会把Application ClassLoader作为入口,开始执行查找的逻辑。但Application ClassLoader不会立即区扫描自己负责的目录(搜索当前目录和第三方库对应的目录),而是会把这个查找任务 交给自己的父加载器 Extension ClassLoader

(2)那么Extension ClassLoader加载器,也不会立刻去扫描自己负责的目录(负责JDK中的一些扩展的库对应的目录),而是把查找任务 交给自己的父加载器BootStrap ClassLoader

(3)则BootStrap ClassLoader 也不想立刻去扫描自己负责的目录(标准库的目录),于是尝试去把查找任务给到其它的类加载器,但是它没有"父亲",它只能亲自去扫描标准库的目录。

(4)"java.lang.String"能够在标准库中找到对应的.class文件,就可以打开并读取文件,那么寻找.class文件的任务就完成了。

(5)如果给定的类不是标准库的类,那么BootStrap ClassLoader在标准库中就找不到.class文件,还是会把查找任务交给"孩子"来执行。

(6)那么任务就会回到Extension ClassLoader加载器,它就会扫描自己负责的扩展库的目录。如果找到了,查找.class任务就结束了;若没找到,还是把任务交给"孩子"执行

(7)任务就又回到了Application ClassLoader类加载器,它就会去扫描自己的当前目录和第三方库目录。若找到了,找.class文件任务结束;若没找到,就会抛出ClassNotFoundException

以上寻找.class文件过程的模型就是"双亲委派模型",其实就是一个 查找优先级 的问题。率先在标准库中去查找.class文件,若没找到,就去扩展库中去找,再找不到,就去第三方库去找,还找不到,就会抛出异常。

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

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

相关文章

在PostgreSQL中,如何创建一个触发器并在特定事件发生时执行自定义操作?

文章目录 解决方案示例代码1. 创建自定义函数2. 创建触发器 解释 在PostgreSQL中,触发器(trigger)是一种数据库对象,它能在特定的事件(如INSERT、UPDATE或DELETE)发生时自动执行一系列的操作。这些操作可以…

基于SSM,JSP超市进销存管理系统

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 权限划分:用户管理员 用户: 登录,注销,查看基本信息,修改基本信息 进货管理: 进货信息:可以新增进货,查询进货&#xff0…

GRAF: Generative Radiance Fields for 3D-Aware Image Synthesis

GRAF: Generative Radiance Fieldsfor 3D-Aware Image Synthesis(基于产生辐射场的三维图像合成) 思维导图:https://blog.csdn.net/weixin_53765004/article/details/137944206?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3…

突破速率界限:800G光模块的兴起

在以ChatGPT和NVIDIA DGX H200为代表的技术取得显著进步的时代,人工智能行业同样表现出明显地提升。除此之外,一项改变传统规则的创新出现了:800G光模块。这类优质的设备预示着数据传输和接收领域的变革性转变,成功引起了人们的兴…

【系统架构师】-案例考点(一)

1、软件架构设计 主要考点: 质量属性、软件架构风格、软件架构评估、MVC架构、面向服务的SOA架构、 DSSA、ABSD 1.1、质量属性 1、性能:指系统的响应能力,即要经过多长时间才能对某个事件做出响应,或者在某段时间内系统所能处理的事件的…

利用AQS(AbstractQueuedSynchronizer)实现一个线程同步器

目录 1. 前言 2. 什么是同步器 3. 同步器实现思路 Semaphore(信号量) 4. 代码实现 4.1. 创建互斥锁类 4.2 编写静态内部类,继承AQS 4.3 内部类实现AQS钩子函数 4.3 封装lock,unlock方法 4.4. 测试 5. 总结 本文章源码仓库:Conc…

FPGA - 基于自定义AXI FULL总线的PS和PL交互

前言 在FPGA - ZYNQ 基于Axi_Lite的PS和PL交互中,介绍了基于基于AXi_Lite的PL和PS交互,接下来构建基于基于Axi_Lite的PS和PL交互。 AXI_GP、AXI_HP和AXI_ACP接口 首先看一下ZYNQ SoC的系统框图,如下图所示。在图中,箭头方向代表…

Python 中整洁的并行输出

原文:https://bernsteinbear.com/blog/python-parallel-output/ 代码:https://gist.github.com/tekknolagi/4bee494a6e4483e4d849559ba53d067b Python 并行输出 使用进程和锁并行输出多个任务的状态。 注:以下代码在linux下可用&#xff0c…

Tcpdump -r 解析pcap文件

当我们使用命令抓包后,想在命令行直接读取筛选怎么办?-r参数就支持了这个 当你使用 tcpdump 的 -r 选项读取一个之前捕获的数据包文件,并想要筛选指定 IP 地址和端口的包时,你可以在命令中直接加入过滤表达式。这些过滤表达式可以…

数据可视化(六):Pandas爬取NBA球队排名、爬取历年中国人口数据、爬取中国大学排名、爬取sina股票数据、绘制精美函数图像

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…

基于ThinkPHP框架开发的的站长在线工具箱网站PHP源码(可以作为流量站)

这是一套基于ThinkPHP框架开发的站长在线工具箱网站PHP源码,包含了多种在线工具,可以作为流量站使用。 项 目 地 址 : runruncode.com/php/19742.html 部署教程: 环境要求: - PHP版本需要大于等于7.2.5 - MySQL版…

element-ui合计逻辑踩坑

element-ui合计逻辑踩坑 1.快速实现一个合计 ​ Element UI所提供的el-table中提供了方便快捷的合计逻辑实现: ​ https://element.eleme.cn/#/zh-CN/component/table ​ 此实现方法在官方文档中介绍详细,此处不多赘述。 ​ 这里需要注意&#xff0c…

设备连接IoT云平台指南

一、简介 设备与IoT云间的通讯协议包含了MQTT,LwM2M/CoAP,HTTP/HTTP2,Modbus,OPC-UA,OPC-DA。而我们设备端与云端通讯主要用的协议是MQTT。那么设备端与IoT云间是如何创建通信的呢?以连接华为云IoT平台为例…

React中redux、react-redux、@reduxjs/toolkit状态管理库的使用方式

效果 下载依赖 npm install redux react-redux reduxjs/toolkit --save在src目录下创建文件 创建index.ts文件 import { configureStore } from reduxjs/toolkit import userSlice from ./userReducerconst store configureStore({reducer: {user: userSlice.reducer} }) //…

java实现识别图片上的文字(OCR识别身份证等证件信息)

利用第三方jar包,实现识别图片上的文字。第三方支持地址:Spire.OCR for Java | 专业的图文识别组件,用以读取图片格式中的文本Spire.OCR for Java 是专为 Java 开发者设计的强大OCR库,提供高效的文字识别功能,能够从图…

储存器的专有名词辨析

位:存放一个二进制位字节:8位存放一个二进制数储存单元:一个八位的储存器,叫做一个储存单元储存单元地址:储存单元唯一的固定编号储存单元数据:存放于储存单元的数字储存单元容量:一排能储存单元…

imx6ull设备树

概念 什么是设备树 描述设备树的文件叫DTS,实际上就是在这个DTS文件里面,用树状的结构存储设备之间的关系。在以前这棵树就是设备树。 什么是DTS、DTB、DTC DTS就是我们上面的设备树源码文件、DTB是它的二进制文件、DTC是我们编译DTS的工具&#xff…

echart实现数据传输动态效果

function setDataTransfer(id) {var chart echarts.init(document.getElementById(id)); var items [{level: 1,name: "传感器",label: beijing,value: [20, 10],symbol: "",symbolSize: [30, 30]},{level: 1,symbol: "",name: "物联中心…

imazing64位2.17.6.0新功能介绍以及 iMazing最新版免费激活下载

iMazing for mac是一款可以在苹果电脑Mac os平台上使用的帮助用户管理手机的Mac手机助手,iMazing for mac是能力远超 iTunes 提供的终极的 iOS 设备管理器。IMazing 与你的 iOS 设备 (iPhone、 iPad 或 iPod)相连,使用起来非常的方…

openstack-图形管理 6

安装并配置组件 重启web服务及会话存储服务 图形化登录 删除云主机 使用管理员登录 删除子网网络 删除云主机网络 创建网络 创建云主机 控制节点配置 配置私有网络,配置虚拟子网: 配置ML2插件 配置Linuxbridge(桥接) 配置laye…