JVM虚拟机系统性学习-类加载子系统

news2024/12/23 12:17:21

类加载子系统

类加载的时机

类加载的时机主要有 4 个:

  • 遇到 new、getstatic、putstatic、invokestatic 这四条字节码指令时,如果对应的类没有初始化,则要先进行初始化
    • new 关键字创建对象时
    • 读取或设置一个类型的静态字段时(被 final 修饰、已在编译器将结果放入常量池的静态类型字段除外)
    • 调用一个类型的静态方法的时候
  • 对类进行 反射调用
  • 初始化一个类的时候,如果其父类未初始化,要先初始化其父类
  • 虚拟机启动时,要先加载主类(程序入口)

类加载过程

类的生命周期如下图:

在这里插入图片描述

  • 加载

    1. 通过二进制字节流加载 class 文件
    2. 创建该 class 文件在方法区的运行时数据结构
    3. 创建字节码对象 Class 对象
  • 链接

    1. 验证:目的在于确保 class 文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性

      主要包括四种验证:文件格式验证、元数据验证、字节码验证、符号引用验证

    2. 准备:为类变量(即静态变量)分配内存并且设置类变量的默认初始值,即零值。

      这里不包含用 final 修饰的 static 变量,因为 final 修饰的变量在编译为 class 字节码文件的时候就会分配了,准备阶段会显式初始化

      这里不会为实例变量分配初始化,类变量会分配在方法区,而实例变量是会随着对象一起分配到 Java 堆中

    3. 解析:将常量池内的符号引用转换为直接引用的过程

      事实上,解析操作往往会伴随着 JVM 在执行完初始化之后再执行

      符号引用就是一组符号来描述所引用的莫表。符号引用的字面量形式明确定义在《java虚拟机规范》的Class 文件格式中。直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。

      解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等。

  • 初始化

    虚拟机在初始化阶段才真正开始执行类中编写的 Java 程序代码

    初始化阶段就是执行类构造器 <clinit>() 方法的过程,<clinit>() 是 Javac 编译器自动生成的,该方法由编译器自动收集类中的所有类变量的赋值动作和静态语句块中的语句合并生成的,如果一个类中没有静态代码块, 也没有变量赋值的动作,那么编译器可以不为这个类生成 <clinit>() 方法

类加载器

JVM 中类加载是通过类加载器来完成的

在这里插入图片描述

  • 启动类加载器(Bootstrap ClassLoader):
    • 负责加载 JAVA_HOME\lib 目录中的,或通过 -Xbootclasspath 参数指定路径中的,且被虚拟机认可(按文件名识别,如rt.jar)的类。由 C++ 实现,不是 ClassLoade r的子类
  • 扩展类加载器(Extension ClassLoader):
    • 负责加载 JAVA_HOME\lib\ext 目录中的,或通过 java.ext.dirs 系统变量指定路径中的类库。
  • 应用程序类加载器(Application ClassLoader):
    • 负责加载用户路径 classpath 上的类库
  • 自定义类加载器(User ClassLoader):
    • 作用:JVM自带的三个加载器只能加载指定路径下的类字节码,如果某些情况下,我们需要加载应用程序之外的类文件,就需要用到自定义类加载器

双亲委派机制

加载类的class文件时,Java虚拟机采用的是双亲委派机制,即把请求交给父类加载器去加载

工作原理:

  1. 如果一个类加载器收到了类加载请求,他并不会自己先去加载,而是把这个请求委托给父类的加载器去执行
  2. 如果父类加载器也存在其父类加载器,则继续向上委托
  3. 如果父类加载器可以完成类加载任务,就成功返回;如果父类加载器无法完成类加载任务,则会由自家在其尝试自己去加载

优势:

  1. 避免类的重复加载
  2. 保护程序安全,防止核心API被篡改(例如,如果我们自定义一个java.lang.String类,然后我们去new String(),我们会发现创建的是jdk自带的String类,而不是我们自己创建的String类)

为什么还需要破坏双亲委派?

  • 在实际应用中,可能存在 JDK 的基础类需要调用用户代码,例如:SPI 就打破双亲委派模式(打破双亲委派意味着上级委托下级加载器去加载类)
    • 比如,数据库的驱动,Driver 接口定义在 JDK 中,但是其实现由各个数据库的服务上提供,由系统类加载器进行加载,此时就需要 启动类加载器 委托子类加载器去加载 Driver 接口的实现

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

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

相关文章

12.10_黑马数据结构与算法笔记Java

目录 058 链表 e10 判环算法1 thinking&#xff1a;什么是空指针&#xff1f; 058 链表 e10 判环算法2 059 数组 e01 合并有序数组1 059 数组 e01 合并有序数组2 060 队列 链表实现1 061 队列 链表实现2 062 队列 环形数组实现 方法1-1 063 队列 环形数组实现 方法1-2…

CV计算机视觉每日开源代码Paper with code速览-2023.12.5

点击计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构&#xff1a;Transformer】GIFT: Generative Interpretable Fine-Tuning Transformers 论文地址&#xff1a;https://arxiv.org…

计算机网络——期末考试复习资料

什么是计算机网络 将地理位置不同的具有独立功能的多台计算机及其外部设备通过通信线路和通信设备连接起来&#xff1b;实现资源共享和数据传递的计算机的系统。 三种交换方式 报文交换&#xff1a;路由器转发报文&#xff1b; 电路交换&#xff1a;建立一对一电路 分组交换&a…

carla安装中的问题

1、carla carla安装完后&#xff0c;需要使用python调用API去更换地图&#xff0c;增加车辆等 使用Python调用API过程中可能会报错&#xff1a; 报错1&#xff1a;carla API&#xff08;Carla包&#xff09;版本不对 **解决方法&#xff1a;**需要将这个目录下的三个文件拷…

IDEA已经导入了jar包 还是提示找不到类(解决!!!)

项目代码check到本地,导入到idea中后,编译的时候很多类都报错了,打开发现有些框架中的类找不到。 报错:xxxx程序包找不到,xxxx类找不到 类似我框起来的地方是 报红的,utils这个包都找不到 解决方法: 网上1: 项目是依赖了这个jar包的,打开项目配置,查看依赖树: id…

2023.12.9 关于 Spring Boot 事务传播机制详解

目录 事务传播机制 七大事务传播机制 支持当前调用链上的事务 Propagation.REQUIRED Propagation.SUPPORTS Propagation.MANDATORY 不支持当前调用链上的事务 Propagation.REQUIRES_NEW Propagation.NOT_SUPPORTED Propagation.NEVER 嵌套事务 Propagation.NESTED…

优化您的Mac电脑风扇控制体验 - 尝试Macs Fan Control Pro!

在日常使用Mac电脑过程中&#xff0c;我们经常会遇到电脑发热的问题&#xff0c;特别是在运行大型软件或进行高负载任务时。为了保护电脑硬件&#xff0c;一个高效且可靠的风扇控制软件是必不可少的。 Macs Fan Control Pro是一款专为Mac电脑设计的风扇控制软件&#xff0c;它…

区块链技术是什么?解析其基本原理及应用

区块链技术的基本原理 在数字化时代的推动下&#xff0c;区块链技术作为一项革命性的创新&#xff0c;正逐渐渗透到各个领域&#xff0c;引领着未来科技的发展。区块链技术的基本原理大致可以总结为以下 4 点内容&#xff1a; 1. 去中心化&#xff1a;区块链是一个去中心化…

三(二)ts非基础类型(枚举)

数字枚举 使用enum定义一个枚举类型 enum Color {red,yellow,blue } let clr: Color Color.red如上面代码中&#xff0c;我们定义了一个关于颜色的枚举类型&#xff0c;里面的值会从0开始依次递增&#xff0c;也就是说Color.red为0&#xff0c;Color.yellow为1依次类推。当然…

渲染技术在虚拟仿真中的应用

虚拟仿真&#xff08;Virtual Reality&#xff09;是一种仿真技术&#xff0c;它使用计算机生成一个虚拟世界&#xff0c;用户可以通过各种传感通道与这个虚拟世界进行自然的交互。虚拟仿真技术可以创建和体验虚拟世界&#xff0c;使用户可以像在真实世界中一样进行操作和体验。…

Python - 深夜数据结构与算法之 ArrayList

目录 一.引言 二.ArrayList 介绍 1.List 2.Linked List 3.Skip List 三.经典算法实战 1.Two-Sum [1] 2.Three-Sum [15] 3.Merge-Two-Sorted-List [21] 4.Remove-Duplicates-From-Sorted-Array [26] 5.Plus-One [66] 6.Rotate-Array [189] 7. Move-Zero [283] 四.…

如何公网访问内网的群晖NAS随时随地远程访问本地存储的学习资源

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

双向链表(数据结构与算法)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

基于Java的商城网站系统设计与实现(6000字论文范例)

基于Java的商城网站系统设计与实现 姓 名&#xff1a; 刘德华 学 号&#xff1a; 指导教师&#xff1a; 2023年4月 摘要 随着我国经济活力的不断提升和互联网的快速发展&#xff0c;信息的重要性正在…

SpringIOC之ConditionEvaluator

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

如何使用cpolar+Inis在Ubuntu系统快速搭建本地博客网站公网可访问

文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总…

安装Nacos2.2.3集群

目录 一、传统方式安装 二、Docker安装 一、传统方式安装 1、配置jdk环境 vi /etc/profile JAVA_HOME/usr/local/java JRE_HOME/usr/local/java/jre CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib PATH$JAVA_HOME/bin:$PATH export PATH JAVA_…

统筹高级前端,系统进阶精选案例实战,高效奠定前端基石

在当今的软件开发中&#xff0c;前端技术的重要性日益突出。为了应对不断变化的市场需求和用户期望&#xff0c;前端开发人员需要不断进阶&#xff0c;并掌握高级技术和系统化的实战经验。本文将介绍一些高级前端开发的精选案例&#xff0c;帮助开发者高效地奠定前端基石&#…

WRF--修改geo_em.d01.nc中的变量,保持其他信息不变

WRF–修改geo_em.d01.nc中的变量&#xff0c;保持其他信息不变 首先呢&#xff0c;找到编译WRF过程中自带的读取nc的一个fortran函数&#xff1a;read_wrf_nc.f90 可以使用Linux命令&#xff1a; find / -name read_wrf_nc.f90 找到之后&#xff0c;修改这个文件&#xff0c…

ke14--10章-1数据库JDBC介绍

注册数据库(两种方式),获取连接,通过Connection对象获取Statement对象,使用Statement执行SQL语句。操作ResultSet结果集 ,回收数据库资源. 需要语句: 1Class.forName("DriverName");2Connection conn DriverManager.getConnection(String url, String user, String…