小结:jvm 类加载过程

在这里插入图片描述

类加载过程

是Java虚拟机(JVM)将字节码文件(.class文件)加载到内存中,并转换为运行时数据结构的过程。这个过程可以分为多个步骤,每个步骤都有其特定的任务和目的。根据你提供的信息,以下是类加载过程的三个主要步骤:

1. 加载

在这个阶段,类加载器通过一个类的全限定名来获取定义此类的二进制字节流。这一步骤包括以下几个子步骤:

  • 定位字节源:类加载器需要找到包含类定义的字节码文件。这些字节码文件可能存在于本地文件系统、网络资源、数据库或者其他任何形式的存储介质中。
  • 读取字节流:一旦找到了字节码文件,类加载器会读取该文件的内容,将其转化为字节流。
  • 创建类对象:类加载器使用读取到的字节流来创建一个java.lang.Class对象,这个对象代表了正在被加载的类。

2. 链接

链接阶段的主要任务是将字节流所代表的静态存储结构转化为方法区的运行时数据结构。这个阶段又可以细分为以下三个子阶段:

  • 验证:确保字节流中的信息符合Java虚拟机规范的要求,不会对虚拟机造成危害。验证包括字节码验证、符号引用验证等多个方面。
  • 准备:为类的静态变量分配内存,并设置默认初始值。例如,对于int类型的静态变量,默认值为0;对于引用类型,默认值为null。
  • 解析:将类的常量池内的符号引用替换为直接引用。符号引用是以字符串形式存在的,而直接引用可以直接指向目标。

3. 初始化

在这里插入图片描述

在初始化阶段,JVM会执行类构造器<clinit>()方法,这个方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块,中的语句合并产生的。初始化阶段是执行类中定义的Java程序代码(或者说是字节码)的阶段,前面的类加载过程中,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由JVM主导和控制。到了初始化阶段,才真正开始执行类中编写的Java程序代码(或者说是字节码)。

类加载类型

在这里插入图片描述

在这里插入图片描述

1. 类加载器类型

  • Bootstrap Class Loader
    由JVM内部实现(如C++),负责加载核心类库(如rt.jar)。它是所有类加载器的根基,但没有对应的Java对象,因此在代码中不可直接访问。
  • Extension Class Loader
    加载JRE扩展目录(如jre/lib/ext)中的类,父加载器为Bootstrap(但通常以null表示)。
  • System/Application Class Loader
    加载应用程序类路径(-classpath-cp)的类,父加载器是Extension。
  • User-Defined Class Loader
    用户自定义的类加载器(需继承ClassLoader类),可灵活指定其父加载器(默认父加载器是System)。

2. 包含关系

  • 不是继承关系:类加载器之间的层次通过组合实现(每个加载器持有父加载器的引用),而非类的继承。例如,ClassLoader类中有一个parent字段指向父加载器。
  • 委派模型:加载类时,子加载器会先委派父加载器尝试加载,父加载器失败后子加载器才自行加载。这种“双亲委派”机制确保了核心类的安全性。

3. **图示关系

Bootstrap Class Loader↑(隐含引用)
Extension Class Loader↑(parent字段引用)
System Class Loader↑(parent字段引用)
User-Defined Class Loader(可多个,各自独立)

Java类加载器之间的关系通过委派模型协作,形成逻辑上的层次结构,但并非通过类继承实现,而是通过对象间的引用组合(即包含关系)。具体如下:

// System Class Loader 的 parent 是 Extension Class Loader
ClassLoader systemLoader = ClassLoader.getSystemClassLoader();
ClassLoader parent = systemLoader.getParent(); // 父加载器是 Extension

4. Optional的说明

  • Optional可能指Java 9+模块化系统中的类加载器(如PlatformClassLoader),或特定场景下的可选加载器(如OSGi、Tomcat的WebApp类加载器)。它们与上述加载器协作,但遵循相同的委派逻辑。

总结

类加载器通过委派链形成包含关系,每个加载器通过parent字段引用父加载器,而非继承。这种设计保障了核心类库的隔离性与安全性,同时允许用户自定义类加载逻辑。

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

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

相关文章

2024 山东省ccpc省赛

目录 I&#xff08;签到&#xff09; 题目简述&#xff1a; 思路&#xff1a; 代码&#xff1a; A&#xff08;二分答案&#xff09; 题目简述&#xff1a; 思路&#xff1a; 代码&#xff1a; K&#xff08;构造&#xff09; 题目&#xff1a; 思路&#xff1a; 代…

turn.js与 PHP 结合使用来实现 PDF 文件的页面切换效果

将 Turn.js 与 PHP 结合使用来实现 PDF 文件的页面切换效果&#xff0c;你需要一个中间步骤将 PDF 转换为 Turn.js 可以处理的格式&#xff08;如 HTML 页面或图片&#xff09;。以下是实现这一功能的步骤和示例代码&#xff1a; 步骤 1: 安装必要的库 首先&#xff0c;你需要…

Python实现NOA星雀优化算法优化卷积神经网络CNN回归模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 在当今数据驱动的时代&#xff0c;卷积神经网络&#xff08;CNN&#xff09;不仅在图像分类任务中…

(面试)View相关知识

1、View绘制流程 onMeasure() 确定View的测量宽高。onLayout() 确定View的最终宽高和四个顶点的位置。onDraw() 将View 绘制到屏幕上。 2、MeasureSpec有三种测量模式&#xff1a; 2.1. EXACTLY&#xff08;精确模式&#xff09; 含义&#xff1a;父容器明确指定了子View的精…

数组名既可作为指针也可作为变量名

在C语言中&#xff0c;数组名在不同的上下文中既可以作为指向数组首个元素的指针&#xff0c;也可以代表整个数组&#xff0c;这是由C语言的设计和语法规则决定的&#xff0c;下面我来详细解释一下。 1. 数组名作为指向首元素的指针 在大多数情况下&#xff0c;当数组名出现在…

Java异常、泛型与集合框架实战:从基础到应用

在Java编程的世界里&#xff0c;异常处理、泛型和集合框架是构建高效、健壮应用的关键技术。通过掌握这些技术&#xff0c;我们可以更好地管理程序运行时的错误&#xff0c;提高代码的复用性和类型安全性。今天&#xff0c;我将通过一系列实验&#xff0c;分享如何在Java中使用…

Spring源码之解决循环依赖 三级缓存

目录 三级缓存核心原理 循环依赖的解决过程 1. Bean A创建过程中提前曝光工厂 2. Bean B创建时发现依赖A&#xff0c;从缓存获取 3. Bean A继续完成初始化 三级缓存的作用总结 二级缓存为何不够解决缓存依赖&#xff1f; 三级缓存如何解决&#xff1f; 为什么不直接在…

K8S Ingress 实现AB测试、蓝绿发布、金丝雀(灰度)发布

假设有如下三个节点的 K8S 集群&#xff1a; ​ k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、场景分析 阅读本文&#xff0c;默认您已经安装了 Ingress Nginx。 1&#xff09;A/B 测试 A/B 测试基于用户请求的元信息将流量路由…

深入理解构造函数,析构函数

目录 1.引言 2.构造函数 1.概念 2.特性 3.析构函数 1.概念 2.特性 1.引言 如果一个类中什么都没有&#xff0c;叫作空类. class A {}; 那么我们这个类中真的是什么都没有吗?其实不是,如果我们类当中上面都不写.编译器会生成6个默认的成员函数。 默认成员函数:用户没有显…

Oracle 11.2.0.4 pre PSU Oct18 设置SSL连接

Oracle 11.2.0.4 pre PSU Oct18 设置SSL连接 1 说明2 客户端配置jdk环境3服务器检查oracle数据库补丁4设置ssla 服务器配置walletb 上传测试脚本和配置文件到客户端c 服务器修改数据库侦听和sqlnet.orad 修改客户端的sqlnet.ora和tnsnames.ora的连接符e 修改java代码的数据连接…

BrepGen中的几何特征组装与文件保存详解 deepwiki occwl OCC包装库

有这种好东西我怎么不知道 AutodeskAILab/occwl: Lightweight Pythonic wrapper around pythonocc 组装几何特征以创建B-rep模型 保存为STEP和STL文件细说 Fast 快速 Searched across samxuxiang/BrepGen Ill explain how BrepGen assembles geometric features to create B-r…

重庆 ICPC 比赛游记

2025.5.9 比赛前一天晚上&#xff0c;激动地睡不着觉&#xff0c;起来收拾了好多东西。&#xff08;其实就四本书&#xff0c;剩下的全是零食……关键在于这四本书基本没用。&#xff09; 2025.5.10 学校丧心病狂的让我们 6:20 到校门口集合坐车&#xff08;据说是怕赶不上比…

0x08.Redis 支持事务吗?如何实现?

回答重点 Redis 支持事务,但它的事务与 MySQL 等关系型数据库的事务有着本质区别。MySQL 中的事务严格遵循 ACID 特性,而 Redis 中的事务主要保证的是命令执行的原子性和隔离性,即所有命令在一个不可分割的操作中顺序执行,不会被其他客户端的命令请求所打断。 最关键的区…

佰力博科技与您探讨表面电阻的测试方法及应用领域

表面电阻测试是一种用于测量材料表面电阻值的技术&#xff0c;广泛应用于评估材料的导电性能、静电防护性能以及绝缘性能。 1、表面电阻的测试测试方法&#xff1a; 表面电阻测试通常采用平行电极法、同心圆电极法和四探针法等方法进行。其中&#xff0c;平行电极法通过在试样…

数据库的规范化设计方法---3种范式

第一范式&#xff08;1NF&#xff09;&#xff1a;确保表中的每个字段都是不可分割的基本数据项。 第二范式&#xff08;2NF&#xff09;&#xff1a;在满足1NF的基础上&#xff0c;确保非主属性完全依赖于主键。 第三范式&#xff08;3NF&#xff09;&#xff1a;在满足2NF的基…

产品经理入门(2)产品体验报告

产品体验报告大纲&#xff1a;重点在产品体验——优点。 1.产品概括 可以从各大平台搜产品介绍。 2.市场分析 按照产品方向分析各个指标——包括有效使用时间,市场规模等。 3. 用户分析——对用户通过各项指标画像。 4.产品体验——对各项功能与设计的体验。 5.报告总结

[Java][Leetcode simple] 13. 罗马数字转整数

一、自己想的 只有提到的六种情况是-&#xff0c;其他都是 public int romanToInt1(String s) {int res 0;int n s.length();Map<Character, Integer> map new HashMap<>();map.put(I, 1);map.put(V, 5);map.put(X, 10);map.put(L, 50);map.put(C, 100);map.pu…

如何在 CentOS 7 虚拟机上配置静态 IP 地址并保持重启后 SSH 连接

在使用 CentOS 7 的虚拟机时&#xff0c;我们通常需要配置静态 IP 地址&#xff0c;以确保在每次虚拟机重启后能够通过 SSH 连接。本文将介绍如何在 CentOS 7 系统中配置静态 IP 地址&#xff0c;并确保配置在系统重启后依然生效。 步骤 1&#xff1a;检查虚拟机网络接口 首先…

matlab求解问题

一、目的 掌握Matlab中函数求导、函数极值和极限问题的求解,能够借助Matlab工具对简单优化模型进行求解。 二、内容与设计思想 1、函数求导 1.1求解给定函数的一阶导数&#xff1a;diff(y, x)用于对变量x求y的导数。 1.2求解给定函数的二阶导数&#xff1a;在求出一阶导数的…

C语言斐波那契数列

斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列 、兔子数列。由意大利数学家莱昂纳多・斐波那契在 1202 年提出&#xff0c;源于其《算盘书》中一道兔子繁殖问题。定义&#xff1a;在数学上&#xff0c;该数列以递归形式定义。最常见的是…