jvm类加载机制概述

18bd9cc6225d45bcb0898827946949eb.jpg、什么是jvm的类加载机制

 

  类加载机制是指我们将类的字节码文件所包含的数据读入内存,同时我们会生成数据的访问入口的一种 特殊机制。那么我们可以得知,类加载的最终产品是数据访问入口。

 

  加载类文件(即.class文件)的方式有以下几种:

 

从本地系统中直接加载。

通过网络下载的.class文件。比如Web Applet,也就是我们的小程序应用。

从war,jar等归档文件中加载class。

从专有数据库中提取.class文件。

将java源文件动态编译为.class文件,也就是运行时计算而成,java的动态代理技术就是这么实现的。

从加密文件中获取。典型的防止class文件被反编译的保护措施。

回到顶部

2、类装载的过程

  类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个过程包括:装载、验证、准备、解析、初始化、使用、卸载7个阶段。其中验证、准备、解析统称为链接。如下图     

 

 

 

 

 

装载(Loading):

通过一个类的全限定名获取定义此类的二进制字节流,由上文可知,我们不一定从字节码文件中获取字节流,还能通过上述多种方式获取字节流。

将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。

在java堆中生存一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入库。 

      获取类的二进制字节流的阶段是我们java程序员最关注的阶段,也是操作性最强的一个阶段,因为这个阶段我们可以对我们的类加载器进行操作 ,比如我们想自定义类加载器进行操作完成加载,又或者我们想通过java agent来完成我们的字节码增强操作。

 

连接(Linking):

验证(Verification):验证主要是为了保证被加载类的正确性,即装载的Class文件中的字节流保护的信息是否符合当前虚拟机的要求,并且还要求我们的信息不会危害虚拟机自身的安全,导致虚拟机的崩溃。这其中包括四个阶段:

文件格式的验证:第一阶段要验证字节流是否符合class文件格式的规范,并且能被当前版本的虚拟机处理

元数据的验证:第二阶段是对字节码描述的信息进行语义分析,以保证其描述的信息符合Java语言规范的要求。

字节码验证:第三阶段是整个验证过程中最复杂的一个阶段,主要目的是通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。在第二阶段对元数据信息中的数据做完校验后,这个阶段将对类对方法体进行校验分析,保证被校验类对方法在运行时不会做出危害虚拟机安全对事件。

符号引用验证:这是最后一个阶段的验证,它发生在虚拟机将符号引用转化为直接引用的时候(解析阶段), 可以看作是对类自身以外的信息(常量池中的各种符号引用)进行匹配性的校验。符号引用 验证的目的是确保解析动作能正常执行。

准备(Preparation):为类的静态变量分配内存,并将其初始化为默认值。

解析(Resolution):

初始化(Initialization):

    初始化阶段是执行类构造器()方法的过程。在准备阶段,类变量已赋过一次系统要求对初始值,而在初始化阶段,则是根据程序员通过程序制定的主观计划去初始化类变量和其他资源,比如赋值。

 

    在java中,对于初始化阶段,有且只有以下五种情况才会对要求类立刻“初始化”(加载,验证,准备,自然需要在此之前开始):

 

使用new关键字实例化对象、访问或者设置一个类的静态字段(被final修饰、编译器优化时已经放入常量池的例外)、调用类方法,都会初始化该静态字段或者静态方法所在的类。

初始化类的时候,如果其父类没有被初始化过,则要先触发其父类初始化。

使用java.lang.reflect包的方法进行反射调用的时候,如果类没有被初始化,则要先初始化。

虚拟机启动时,用户会先初始化要执行的主类(含有main)

jdk 1.7后,如果java.lang.invoke.MethodHandle的实例最后对应的解析结果是 REF_getStatic、REF_putStatic、REF_invokeStatic方法句柄,并且这个方法所在类没有初始化,则先初始化。

使用(Useing):

主动使用:

创建类的实例,也就是new的方式

访问某个类或接口的静态变量,或者对该静态变量赋值

调用类的静态方法

反射

初始化某个类的子类,则其父类也会进行初始化

java虚拟机启动时被标明为启动类的类(SpringbootApplication类)

被动使用:

引用父类的静态字段,只会引起父类的初始化,而不会引起子类的初始化

定义类数组,不会引起类的初始化      

引用类的static final常量,不会引起类的初始化(如果只有static修饰,还是会引起该类初始化 的)

 

卸载(Unloading):    

    在类使用完成之后,如果满足下面的情况,类就会被卸载:

 

该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例

加载该类的ClassLoader已经被回收

该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法 

 

  如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类对卸载过程其实就是在方法区中清空类信息,java类对整个生命周期就结束类。但是一般情况下启动类加载器加载的类不会被卸载,而我们的其他两种基础类型的类加载器只有极少的情况下才会被卸载。

 

回到顶部

3、类的加载器

  java的类记载器是负责读取java字节码,并转换成java.lang.class类的一个实例的代码模块。类加载器除了用于加载类外,还可以用于确定类在java虚拟机的唯一性。  

 

      一个类在同一个类加载器中具有唯一性(Uniqueness),而不同类加载器中是允许同名类存在的, 这里的同名是指全限定名相同。但是在整个JVM里,纵然全限定名相同,若类加载器不同,则仍 然不算作是同一个类,无法通过 instanceOf 、equals 等方式的校验。

 

  java虚拟机自带有以下三种类加载器:

 

Bootstrap ClassLoader

负责加载$JAVA_HOME中 jre/lib/rt.jar 里所有的class或Xbootclassoath选项指定的jar包。由 C++实现,不是ClassLoader子类。

Extension ClassLoader

负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar 或 -Djava.ext.dirs 指定目录下的jar包。

Application ClassLoader  

负责加载classpath中指定的jar包及 Djava.class.path 所指定目录下的类和jar包。

 

 

  除此之外,用户也可以自定义类加载器:

 

User ClassLoad

通过java.lang.ClassLoader的子类自定义加载class,属于应用程序根据自身需要自定义的 ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader。

 

  

 

 

 

回到顶部

4、双亲委派机制

  “双亲委派”是指子类加载器如果没有加载过该目标类,就先委托父类加载器加载该目标 类,只有在父类加载器找不到字节码文件的情况下才从自己的类路径中查找并装载目标类。

 

  

 

  “双亲委派”机制加载Class的具体过程是:

 

ClassLoader先判断该Class是否已加载,如果已加载,则返回Class对象;如果没有则委托 给父类加载器。

 

父类加载器判断是否加载过该Class,如果已加载,则返回Class对象;如果没有则委托给祖 父类加载器。

 

依此类推,直到始祖类加载器(引用类加载器)。

 

始祖类加载器判断是否加载过该Class,如果已加载,则返回Class对象;如果没有则尝试从其对应的类路径下寻找class字节码文件并载入。如果载入成功,则返回Class对象;如果载入失败,则委托给始祖类加载器的子类加载器。

 

始祖类加载器的子类加载器尝试从其对应的类路径下寻找class字节码文件并载入。如果载入成功,则返回Class对象;如果载入失败,则委托给始祖类加载器的孙类加载器。

 

依此类推,直到源ClassLoader。

 

源ClassLoader尝试从其对应的类路径下寻找class字节码文件并载入。如果载入成功,则返回Class对象;如果载入失败,源ClassLoader不会再委托其子类加载器,而是抛出异常。

 

 

 

 

 

 

 

  “双亲委派”机制只是Java推荐的机制,并不是强制的机制。我们可以继承java.lang.ClassLoader类,实现自己的类加载器。如果想保持双亲委派模型,就应 该重写findClass(name)方法;如果想破坏双亲委派模型,可以重写loadClass(name)方法。

 

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

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

相关文章

ChatGPT chrome扩展下载与安装

官方下载地址 https://chromewebstore.google.com/detail/lpbhmlbicmgjpacbofijdfpcplfhakeo 截图 安装 离线安装 下载地址 https://static.xutongbao.top/app/chatgpt-chrome-crx-v0.0.7.zip 打开链接 chrome://extensions/ 人工智能学习网站 https://chat.xutongbao.to…

获取电商数据的几种方法分享

在数字化时代,电商数据已经成为企业决策的重要依据。无论是市场趋势的洞察、用户行为的分析,还是产品优化和营销策略的制定,都离不开电商数据的支持。本文将分享几种获取电商数据的有效方法,力求在干货满满的同时,也不…

精通【PHP循环结构知识】

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

怎么打包出release.aar包

第一种 选择build variant 更改成release 第二钟 在gradle中选择相应任务来编译 选择assemble release如果没有这个选项,可能是你没有开启那个Task 收集的选项

Acrobat Pro DC 2023 for Mac PDF编辑管理软件

Acrobat Pro DC 2023 for Mac是一款功能强大的PDF编辑和管理软件,旨在帮助用户轻松处理PDF文件。它提供了丰富的工具和功能,使用户可以创建、编辑、转换和注释PDF文件,以及填写和签署PDF表单。 软件下载:Acrobat Pro DC 2023 for …

2024年泰迪杯数据挖掘B题详细思路代码文章教程

目前b题已全部更新包含详细的代码模型和文章,本文也给出了结果展示和使用模型说明。 同时文章最下方包含详细的视频教学获取方式,手把手保姆级,模型高精度,结果有保障! 分析: 本题待解决问题 目标&#…

QT-左框选项卡软件界面框架

QT-左框选项卡软件界面框架 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include <QTextBrowser> #include <QLabel> #include <QPushButton> #include <QSpacerItem> #include <QToolButton> #include <QDebug> #i…

Ribbon有哪些负载均衡策略

负载均衡类都实现了IRule接口。 RandomRule&#xff1a;随机的选用一个实例 RoundRobinRule&#xff1a;轮询的使用实例 RetryRule&#xff1a;在轮询的基础上加了一个错误重试机制&#xff0c;在deadline时间内会不断的重试 WeightResponeTimeRule&#xff1a;根据权重去做…

WebGIS 之 vue3+vite+ceisum

1.项目搭建node版本在16以上 1.1创建项目 npm create vite 项目名 1.2选择框架 vuejavaScript 1.3进入项目安装依赖 cd 项目名 npm install 1.4安装cesium依赖 pnpm i cesium vite-plugin-cesium 1.5修改vite.config.js文件 import { defineConfig } from vite import vue fr…

【Docker笔记05】【网络模式】

一、前言 本系列是根据 B 站 尚硅谷 Docker 视频 学习记录笔记。因为没有视频课件&#xff0c;部分内容摘自 https://www.yuque.com/tmfl/cloud/dketq0。 本系列仅为自身学习笔记记录使用&#xff0c;记录存在偏差&#xff0c;推荐阅读原视频内容或本文参考笔记。 二、简单介…

0.5米多光谱卫星影像在农业中进行地物非粮化、非农化监测

一、引言 随着科技的发展&#xff0c;卫星遥感技术已经成为了农业领域中重要的数据来源。其中&#xff0c;多光谱卫星影像以其独特的优势&#xff0c;在农业应用中发挥着越来越重要的作用。本文将重点探讨0.5米加2米多光谱卫星影像在农业中的应用。 二、多光谱卫星影像概述 多…

金融汽车科技LLM

汇丰银行 众安保险 1. AIGC重塑保险价值链 小额高频 2.构建智能应用的技术方案演进 增加微服务 长记忆&#xff1a;向量库短记忆&#xff1a;对话历史&#xff0c;思考路径&#xff0c;执行历史 中台架构设计 蔚来汽车在大模型的应用实践 公司介绍 应用架构 应用实践 4.大…

【洛谷 P8700】[蓝桥杯 2019 国 B] 解谜游戏 题解(字符串+映射+周期性)

[蓝桥杯 2019 国 B] 解谜游戏 题目背景 题目描述 小明正在玩一款解谜游戏。谜题由 24 24 24 根塑料棒组成&#xff0c;其中黄色塑料棒 4 4 4 根&#xff0c;红色 8 8 8 根&#xff0c;绿色 12 12 12 根 (后面用 Y 表示黄色、R 表示红色、G 表示绿色)。初始时这些塑料棒排…

学习率对精度和损失的影响研究

1 问题 在学习深度学习的过程中&#xff0c;欲探究优化器的学习率对精度和损失的影响。 2 方法 测试不同学习率下网络的性能。 控制其余变量&#xff1a; Beach_size256optimizer torch.optim.SGD网络为三层全连接网络&#xff08;784->512->10&#xff09;训练周期100 …

MySQL MHA高可用数据库

文章目录 MySQL MHA高可用数据库搭建MySQL MHA模拟故障故障修复&#xff1a; MySQL MHA高可用数据库 MHA&#xff08;MySQL High Availability&#xff09;是一个开源的高可用解决方案&#xff0c;用于实现MySQL主从复制集群的故障自动切换。MHA的主要目的是确保MySQL数据库集…

规划控制如何兼顾安全与舒适性

规划控制如何兼顾安全与舒适性 附赠自动驾驶学习资料和量产经验&#xff1a;链接 **导读&#xff1a;**自动驾驶技术研发对于“安全第一”的追求是毋庸置疑的&#xff0c;但是这中间可能就忽视了舒适性。 因此&#xff0c;今天我想给大家分享的是&#xff0c;自动驾驶研发如何…

微信小程序(黑马优购:登录)

1.点击结算进行条件判断 user.js //数据 state: () >({ // address: {} address: JSON.parse(uni.getStorageSync(address) || {}), token: }), my-settle.vue computed: { ...mapGetters(m_cart,[checkedCount,total,checkedGoodsAmount]), …

@JsonProperty和@JSONField注解的区别

JSON&#xff08;JavaScript Object Notation&#xff09; json是一种常见的数据交换的轻量级数据格式。HTTP协议传输数据可以有多种数据格式&#xff0c;比如下面几种常见数据传输格式&#xff0c;除此之外还有其他的数据交换格式。 数据传输类型编码类型示例表单格式applic…

Qt使用opencv,进行视频录制,功能打开、关闭摄像头,开始、结束录制视频,暂停、继续录制,并保存视频文件

1.效果图 2 代码实现 2.1 .h文件 #ifndef VIDEORECORDWIDGET_H #define VIDEORECORDWIDGET_H#include <QWidget>#include<QFileDialog>#include <QImage> #include <QLabel> #include <QTimer> #include <opencv2/opencv.hpp>using name…

金三银四面试题(九):JVM常见面试题(3)

今天我们继续探讨常见的JVM面试题。这些问题不比之前的问题庞大&#xff0c;多用于面试中JVM部分的热身运动&#xff0c;开胃菜&#xff0c;但是大家已经要认真准备。 你能保证GC 执行吗&#xff1f; 不能&#xff0c;虽然你可以调用System.gc() 或者Runtime.gc()&#xff0c…