JVM的类加载的过程以及双亲委派模型

news2024/11/23 12:57:16

目录

1、加载 (加载字节码文件,生成.class对象)

2、验证(验证Class文件是否符合规范) 

3、准备 (为静态变量分配内存并设置变量初始值)

4、解析(初始化常量池中的一些常量) 

5、初始化(初始化对象,并为静态变量赋值) 

总结:

双亲委派模型:  

JVM的类加载器(主要有3个): 

标准库中的String类是怎样被加载的? 

自定义的类如何加载? 

类加载一定要使用双亲委派模型吗? 

为什么Tomcat不使用双亲委派模型? 

Tomcat是怎么实现webapps下各个web应用程序的隔离的?


类加载过程简单来说就是把.class文件加载到内存中构造出类对象 

JVM的类加载过程要经历以下几个阶段:加载->连接->初始化 

其中连接阶段可以细分成:验证->准备->解析

所以也可以说JVM的类加载过程是这几个阶段: 加载->验证->准备->解析->初始化

1、加载 (加载字节码文件,生成.class对象)

首先要进行加载的过程。加载过程就是要找到.class文件,打开并读取它。在这个过程中要先从.class文件中获取到这个类的二进制字节流,然后将这个字节流代表的静态存储结构转化为方法运行时的数据结构,最后在内存中生成一个代表该类的java.long.Class对象,然后把这个放到方法区,作为该类的数据访问接口。 

二进制的.class文件包含内容:

详情见Java虚拟机规范手册:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html 

2、验证(验证Class文件是否符合规范) 

在进行读取前,要先验证Class文件字节流中包含的信息是否符合Java虚拟机规范的约束条件, 验证的内容包括:文件格式,字节码,符号引用

3、准备 (为静态变量分配内存并设置变量初始值)

准备阶段是正式为类中的属性(static修饰的变量)分配内存和进行初始值的设定

如:public static int num=123;在准备阶段并不会对num进行赋值123,而是先设定num=0;

4、解析(初始化常量池中的一些常量) 

前面我们说到.class文件中包含的内容,在这一阶段,JVM会将符号引用转化为直接引用,也就是在这一阶段,会对常量进行一个初始化。

5、初始化(初始化对象,并为静态变量赋值) 

在这一阶段,Java虚拟机开始真正的执行类中的代码,进行对象的初始化,并且为静态变量赋值,比如前面的 num 就会在这一阶段被赋值为123,而不是原来的0了。

总结:

 

双亲委派模型:  

双亲委派模型属于一种类加载的机制。

前面我们说到了类加载的过程经历了加载-> 连接->初始化的过程。其中加载的过程是加载字节码文件,生成.class对象。在这个加载的过程中类加载器发挥着至关重要的作用,而双亲委派模型就是描述类加载器是如何根据全限定名(类名+包名,如java.long.String)找到.class文件的过程,这个过程属于加载过程的靠前的阶段。

JVM的类加载器(主要有3个): 

JVM的类加载器主要是下面这3个:

BootSharpClassLoader(负责加载标准库当中的类(如List,String))

ExtensionClassLoader(负责加载JDK扩展库当中的类)

ApplicationClassLoader(负责加载当前目录当中的类) 

除此之外,用户也可以自定义类加载器:User-DefinedClassLoader,一般没有使用自定义加载器,所以默认就是上面的那3种类加载器。每个类加载器负责加载自己负责的目录。 

下图来源于博客: JVM类加载器-CSDN博客

 

双亲委派模型就是描述了上述的类加载器之间是怎么配合的 。

例子(没有自定义类加载器):

标准库中的String类是怎样被加载的? 

第一步:程序启动,进入ApplicationClassLoader类加载器

第二步:在ApplicationClassLoader中检查其父类加载器ExtensionClassLoader是否被加载过,如果没有加载过就进入到ExtensionClassLoader中

第三步:在ExtensionClassLoader中检查最高父类加载器BootSharpClassLoader是否加载过,没有就进入BootSharpClassLoader中。 

最后在BootSharpClassLoader中查找标准库的目录:java.long.String,完成String的加载。

自定义的类如何加载? 

如果是自定义的类,也会经历上述过程,但是由于在BootSharpClassLoader目录中无法找到该自定义的类就会回到上一级ExtensionClassLoader中进行加载,如果还是找不到就会到上一级ApplicationClassLoader当中进行加载,然后再当前目录中找到了自定义的类进行加载。

 

 如果在最后没有成功加载就会抛出ClassNotFoundException。

双亲委派模型的优势:

当用户自定义的类与标准库中的类的全限定名重复了,依然可以准确的加载标准库中的类,而不是自定义的类,比如自定义一个和标准库中的java.long.String的一样的类,当类加载器加载到BootSharpClassLoader的时候就不会再返回了,就加载的是标准库中的类。  

类加载一定要使用双亲委派模型吗? 

不一定,因为双亲委派模型只是类加载机制中的一种,是适用于JVM的类加载的,而像Tomcat加载webapps中的类则没有使用双亲委派模型。

为什么Tomcat不使用双亲委派模型? 

首先Tomcat中的webapps下面有很多的web应用程序。

第一个原因:隔离性,为了保证每个web应用程序之间互不干扰,可以相互独立互不干扰的加载和销毁各自的类,不会因为web程序因为重名或者版本不同等原因造成冲突。

第二个原因:方便动态的重新加载已经加载过的类,使得开发和部署的效率更高。 

Tomcat是怎么实现webapps下各个web应用程序的隔离的?

Tomcat自定义了一个webapp类加载器,并且给每一个web应用程序都创建一个类加载器,所以不同的类加载器加载的就是不同的类了。 

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

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

相关文章

索引的分类

1.唯一索引 给表中某一列设置为了唯一约束(这列不允许出现重复数据)后,数据库会为将这一列设置索引,这个索引叫做唯一索引(主键那一列是一个特殊的唯一索引,不仅要满足唯一索引这一列不可以出现重复数据,而且这一列还…

Android opencv

install cmake cpp folder,新建c项目 获取 OpenCV4Android SDK O4A_SDK 下载,并解压 ~/Downloads/OpenCV-android-sdk$ tree -d -L 2 . ├── apk ├── samples │ ├── 15-puzzle │ ├── camera-calibration │ ├── color-blob-detection │ ├…

文件:IO流

1. 什么是IO /O 即输入Input/ 输出Output的缩写,其实就是计算机调度把各个存储中(包括内存和外部存储)的数据写入写出的过程;java中用“流(stream)”来抽象表示这么一个写入写出的功能,封装成一…

Vue学习笔记(7. axios异步请求)

1. axios请求方式 方式1:axios({method:"GET",url:"..."}) 方式2:axios({method:"POST",url:"...",data:"..."}) 方式3:axios.get("url...") 方式4:axios.post(…

Python中的35个关键字

✅作者简介:CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1🏆 📃个人主页:hacker707的csdn博客 🔥系列专栏:零基础入门篇 💬个人格言:不断的翻越一座…

【 Spring MVC 核心功能(二) - 获取参数(下)】

文章目录一、使用 RequestBody 接收JSON对象二、使用 RequestPart 上传⽂件三、获取 Cookie四、获取 Header五、存储和获取 Session5.1 存储 Session5.2 获取 Session一、使用 RequestBody 接收JSON对象 有时客户端会通过 post 方式发送 json 格式的请求,那后端就可…

2.3.5双链表

单链表vs双链表 就是既有前驱指针也有后继指针,由line改为double。 双链表的插入怎么实现? s->nextp->next; p->next->priors s->priorp //把p赋给s的前驱指针指向的位置 p->nexts; 如果p刚好是最后一个元素。 p->next->prio…

基于ArcGIS的电子地图矢量化方法

一、电子地图及纸质地图矢量化的目的 地图数据来源有很多,其中栅格数据数字化是地图数据的重要来源。栅格数据的矢量化包括地理配准以及矢量化。矢量化后的地图数据往往可以为我们的空间统计分析提供实验依据,从而探究地理分布的时空差异性。 空间参考&a…

完整指南:如何安装Man手册

Man手册简介 man手册是Unix和类Unix操作系统中的命令行工具,用于提供关于特定命令、函数和文件的帮助文档。它通常包含命令的语法、选项、参数、示例以及其他相关信息。man手册可以通过在终端输入"man"命令,后跟要查看的命令或函数名称来访问…

huggingface transformer模型介绍

总结: 模型提高性能:新的目标函数,mask策略等一系列tricks Transformer 模型系列 自从2017,原始Transformer模型激励了大量新的模型,不止NLP任务,还包括预测蛋白质结构,时间序列预测。 有些模…

灌区流量监测设备-中小灌区节水改造

系统概述 灌区信息化管理系统主要对对灌区的水情、雨情、土壤墒情、气象等信息进行监测,对重点区域进行视频监控,同时对泵站、闸门进行远程控制,实现了信息的测量、统计、分析、控制、调度等功能。为灌区管理部门科学决策提供了依据&#xf…

Python 无监督学习实用指南:6~10

原文:Hands-on unsupervised learning with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关…

23年5月高项学习笔记12 —— 干系人管理

过程: 1. 识别干系人:定期识别干系人,分析和记录他们的利益,参与度、相互依赖性、影响力和对项目的潜在的影响 输入:立项管理文件、沟通管理计划、干系人参与计划、需求文件、变更日志、问题日志、协议(协…

今天给大家介绍一篇基于springboot的医院管理系统的设计与实现

临近学期结束,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问题,今天给大家介绍一篇基…

2023/4/10总结

线段树 线段树是一种二叉树,通俗易懂的来说就是对于一个线段,我们会用一个二叉树来表示。线段树是一种工具,她能把对区间(线段)的修改与维护从0(N)的时间复杂度变成0(logN)。 如图: 如上图,我…

MYSQL SQL语句优化技术技巧

MySQL是一种流行的关系型数据库管理系统,它提供了各种各样的SQL语句优化技术,下面是一些常见的优化技巧: 1. 使用索引 索引可以大大提高查询性能。在MySQL中,可以使用CREATE INDEX语句在列上创建索引。当查询包含WHERE子句并且…

Google SEO 搜索中心

在公司发展还没有那么成熟的时候,也许你的测试网站是外网可以公开访问的,也许你网站中的机密图片在测试环境(不小心上到正式环境)却被搜索引擎无情抓取,以及有些内部用户才能使用的网址,你并不想被搜索引擎…

明着呼吁暂停,暗着囤积GPU,马斯克暗度陈仓玩得溜

众所周知,此前马斯克纠集了上千名科技工作者对生成式人工智能的深度训练表示了质疑,呼吁暂停继续对深度人工智能的训练,哪怕先暂停六个月。呼吁的尘埃还没有彻底落地,就传出了马斯克已经悄悄地囤积了上万枚GPU,构建自己…

《花雕学AI》15:BingGPT桌面端——尝鲜体验ChatGPT4.0同源技术新Bing的最新成果

引言: 本文将介绍 BingGPT桌面端的开发背景和目的,以及它与新 Bing 的关系和区别。本文还将说明BingGPT桌面端的主要功能和特点,以及如何下载、安装和使用。最后,本文将评价 BingGPT桌面端对于新 Bing 的人工智能聊天功能的推广和…

dolphinscheduler资源中心

资源中心 资源中心介绍 资源中心提供文件管理,UDF管理,任务组管理。 文件管理可以访问要执行的hive的sql文件 UDF管理可以放置fllink执行的自定义udf函数jar包,hive自定义的UDF函数jar包 以上的*.sql,*.jar文件可以理解为资源&#xff0c…