JVM二:JVM类加载机制

news2024/11/15 22:19:28

目录

前言

1.什么是类加载?

2.类加载整体流程

3.一个类什么时候被加载?

4.双亲委派模型

4.1 JVM默认提供了三个类加载器

4.1.1 BootstrapClassLoader

4.1.2 ExtensionClassLoader

4.1.3 ApplicationClassLoader

4.2 破坏双亲委派模型


前言

在上一篇文章中,我们主要简述了JVM内存区域划分的相关知识,下面我们将讲述JVM类加载机制

1.什么是类加载?

        类加载就是.class文件(.java通过javac进行编译成class文件),从文件(硬盘)被加载到内存中(元数据区)的过程。

2.类加载整体流程

  • 1.加载:把.class文件找到,打开文件,读文件,把文件内容读到内存中;
  • 2.验证:检查下.class文件格式是否规范;
  • 3.准备:给类对象分配内存空间(先在元数据占个位置),也使静态成员被设置成0;
  • 4.解析初始化字符串常量,把符号引用转为直接引用。初始化字符串常量时,首先需要为字符的实际内容分配一块内存空间,并确保有一个引用指向这块内存空间的起始地址。在类加载之前,字符串常量存在于.class文件中,这个"引用"记录的是它在文件中的偏移量(占位符),而不是字符串常量的真正地址。当类加载完成后,字符串常量才会被放入内存中,此时引用会被赋值为实际的内存地址。
    • 举例:假设你得到了一张古老的藏宝图,这张藏宝图标记了一处隐藏的宝藏位置。这个过程与字符串常量的处理有类似之处:
    • 1. 藏宝图的研究(类加载前):在开始挖掘宝藏之前,藏宝图就像是一个.class文件里的字符串常量。你知道这张图代表了什么,但还没有实际的行动。图中标记的位置不是真实的地址,而是告诉你宝藏可能在哪里的一种“偏移量”或线索;

    • 2. 准备挖掘(类加载):决定根据藏宝图去探险,就好比是类加载的过程。你开始准备必要的工具,如铲子和地图,这相当于JVM为字符串常量分配内存空间;

    • 3. 定位宝藏(引用转换):出发后,你按照藏宝图上的线索前进,这如同符号引用被转换为直接引用。你通过解读地图上的线索(可能是一棵树、一块石头或一个特定形状的地标),逐步接近宝藏的实际位置。

    • 4. 挖掘宝藏(访问地址):当你到达指定地点并开始挖掘时,这就像是JVM访问字符串常量在内存中的实际位置。你挖出宝藏的那一刻,就类似于程序最终使用到这个字符串常量的内容。

      通过这个例子,我们可以看到,藏宝图的使用过程(从解读到实际挖掘出宝藏)与JVM如何处理字符串常量(从类加载到实际使用字符串内容)有着相似的步骤。都是先有一个初步的指引(无论是藏宝图还是符号引用),然后通过一系列的动作(解读和应用),最终达到目的(找到宝藏或获取字符串内容)。

  • 5.初始化:调用构造方法,进行成员初始化,执行代码块,静态代码块,加载父类等。

3.一个类什么时候被加载?

  • 首先我们要知道,不是Java程序一运行,就把所有的类都加载,而是真正用到才加载(懒汉模式),一旦加载过后,后续无需再重复加载;
  • 加载的内容有:
    • 1.构造类的实例;
    • 2.调用这个类的静态方法/使用静态属性;
    • 3.加载子类,就会先加载其父类

4.双亲委派模型

在上面的类加载的整体流程中,我们说到了加载,

加载:把.class文件找到,打开文件,读文件,把文件内容读到内存中

  • 双亲委派模型描述了类加载器在查找和加载.class文件时的基本过程。
  • 4.1 JVM默认提供了三个类加载器

    • 4.1.1 BootstrapClassLoader

      • 负责加载标准库的类
        • (Java规范,要求提供哪些类)无论是哪种JVM的实现,都会提供这些一样的类
    • 4.1.2 ExtensionClassLoader

      • 负责加载JVM扩展库中的类
        • (规范之外,由实现JVM的厂商/组织,提供的额外的功能)
    • 4.1.3 ApplicationClassLoader

      • 负责加载用户提供的第三方库/用户项目代码中的类
    • 上述的三个类存在"父子关系",相当于每个class loader有一个parent属性,指向自己的父 类加载器

    • 4.1.4 上述的类加载器如何配合工作?
      • 1.首先,类加载过程是从ApplicationClassLoader开始的。然而,ApplicationClassLoader不会直接进行加载,而是将加载任务委托给自己的父 类加载器。接下来,ExtensionClassLoader接收到委托后,同样不会立即加载,而是再次将自己作为父类加载器,并将加载任务委托给它的父 类加载器BootstrapClassLoader。BootstrapClassLoader在收到委托时,发现自己没有父类加载器(即父类为null),于是它自己执行实际的加载操作
      • 2.BootstrapClassLoader会搜索自己负责的标准库目录,寻找相关的类。如果找到了目标类,则进行加载;如果没有找到,它会将加载任务委托给子类加载器。ExtensionClassLoader会真正地搜索扩展库相关的目录,同样地,如果找到了目标类,则进行加载;如果没有找到,它也会将加载任务委托给子类加载器。ApplicationClassLoader则会搜索用户相关的目录,如果找到了目标类,则进行加载;如果没有找到,由于此时已经没有其他子类加载器了,所以只能抛出一个类找不到的异常。
      • 3.为什么要有上述顺序?
        • 上述这套顺序实际上是由JVM实现代码的逻辑所决定的,这种逻辑类似于递归的方式;
        • 主要目的是确保Bootstrap能够优先加载,而Application能够稍后加载,以避免用户创建一些奇怪的类,从而引发不必要的bug;
        • 在一方面,类加载器可以由用户自定义。除了JVM自带的Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader之外,用户可以创建自己的类加载器,并将其加入到类加载流程中。这样,用户可以根据自己的需求决定加载顺序,并且可以与现有的加载器配合使用。

4.2 破坏双亲委派模型

      1.自己编写的类加载器可以根据需求选择是否遵守双亲委派模型。

      2.举例来说,Tomcat是一个Web服务器,它需要加载Web应用程序中的类。在这种情况下,Tomcat可能会使用单独的类加载器来加载Webapp,而不是遵循双亲委派模型。

      3.这样做的好处是可以避免不同Web应用程序之间的类冲突,并且可以更好地控制每个Web应用程序的类加载过程。然而,如果一个自定义的类加载器不遵循双亲委派模型,那么它必须自行处理类的查找和加载,这可能会导致一些额外的复杂性和潜在的问题。因此,是否遵守双亲委派模型主要取决于具体的需求和设计决策。 

 以上就是JVM类加载机制的简单介绍。

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

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

相关文章

江科大/江协科技 STM32学习笔记P21

文章目录 ADC模数转换器ADC简介逐次逼近型ADCSTM32的ADCADC基本结构输入通道转换模式单次转换,非扫描模式连续转换,非扫描模式单次转换,扫描模式连续转换,扫描模式 触发控制数据对齐转换时间校准硬件电路电位器产生可调电压的电路…

Python图像背景去除

目录 🎁库的导入 🎀库的安装 🎁rembg库去除背景 🎁效果 🎁文末彩蛋 今天来介绍一个特别有趣的python库,rembg库,全称是“Remove Background”的缩写,意为“去除背景”&#xff…

边缘计算与物联网实训室解决方案

一、引言 随着物联网(IoT)技术的迅猛发展,数据量呈爆炸性增长,对数据处理和实时响应能力提出了更高要求。传统的云计算模式由于数据传输延迟和带宽占用等问题,难以满足物联网场景中对低延迟和高可靠性的需求。边缘计算…

QT判断操作系统类型和CPU架构

一、判断操作系统类型 1.在.pro文件中判断 macx { # mac only } unix:!macx{ # linux only } win32 { # windows only }2.在代码中判断 可以包含QGlobal头文件&#xff0c;判断预定义宏 #include <QtGlobal> ... #ifdef Q_OS_MAC // mac #endif#ifdef Q_OS_LINUX // …

Datawhale X 魔搭 AI夏令营 Task1 从零入门AI生图原理实践笔记

赛题内容 参赛者需在可图Kolors模型的基础上训练LoRA模型&#xff0c;生成无限风格&#xff0c;如水墨画风格、水彩风格、赛博朋克风格、日漫风格… 基于LoRA模型生成8张图片组成连贯故事&#xff0c;故事内容可自定义&#xff1b;基于8图故事&#xff0c;评估LoRA风格的美感度…

企业大模型落地从0到0.1

现在人工智能里的“大明星”——大模型&#xff0c;正在悄悄改变各行各业。这就像给企业装上了一颗聪明的大脑&#xff0c;能帮助解决各种棘手问题&#xff0c;提升工作效率。今天&#xff0c;我们就来分析下企业如何一步一步让这个“大脑”在自家地盘里真正派上用场&#xff0…

LVS 实现四层负载均衡项目实战--DR模式

一、环境准备 主机名IP地址router eth0&#xff1a;172.25.254.100 eth1&#xff1a;192.168.0.100 clienteth0&#xff1a;172.25.254.200lvseth1&#xff1a;192.168.0.50web1web2 1、client配置 [rootclient ~]# cat /etc/NetworkManager/system-connections/eth0.nmconne…

ArrayList 动态扩容

目录 一、 构造函数1、有参构造函数2、无参构造函数 二、数组扩容三、总结 一、 构造函数 1、有参构造函数 1.1如果指定了容量大小&#xff0c;创建该大小的数组 1.2如果没有指定大小&#xff0c;默认创建空数组 1.3如果是指定小于0的大小&#xff0c;抛出异常 2、无参构造…

前端工程化15-邂逅ES6的语法规范

4、ES6邂逅 3.1、什么是ECMA ECMA&#xff08;European Computer Manufacturers Association&#xff09;中文名为欧洲计算机制造商协会&#xff0c;这个组织的目标是评估、开发和认可电信和计算机标准。1 994年后该组织改名为Ecma国际。 3.2、什么是ECMAScript ECMAScript…

怎样找回U盘里误删的文件?试试这些方法!

在日常工作和生活中&#xff0c;我们经常会使用U盘来存储和传输重要的文件。然而&#xff0c;由于操作失误或其他原因&#xff0c;我们有时会误删U盘中的文件。当遇到这种情况时&#xff0c;很多人可能会感到焦虑和无助。不过&#xff0c;幸运的是&#xff0c;有几种方法可以帮…

三十六、【人工智能】【机器学习】【监督学习】- Bagging算法模型

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

【清空大脑】

清空大脑&#xff0c;就是把大脑里的想法&#xff0c;都写下来&#xff0c;放到一个地方。这样&#xff0c;可以降低大脑的压力。 我记得我第一次清空大脑的时候&#xff0c;使用的事微软OutLook的便签功能&#xff0c;一共记录了200多项。 看着这200多项&#xff0c;我感觉自…

ubuntu设置开机自动执行脚本、ubuntu设置开机自动启动java服务

使用 crontab 编辑器添加一个任务&#xff0c;该任务将在系统启动时执行你的脚本。在终端中运行以下命令&#xff1a; crontab -e添加开机自启任务&#xff1a; 在打开的编辑器中&#xff0c;添加以下行&#xff1a; reboot /home/demo.jar &这行代码告诉 cron 在每次系统…

微调神器LLaMA-Factory官方保姆级教程来了,从环境搭建到模型训练评估全覆盖

1. 项目背景 开源大模型如LLaMA&#xff0c;Qwen&#xff0c;Baichuan等主要都是使用通用数据进行训练而来&#xff0c;其对于不同下游的使用场景和垂直领域的效果有待进一步提升&#xff0c;衍生出了微调训练相关的需求&#xff0c;包含预训练&#xff08;pt&#xff09;&…

探索AI角色扮演的新前端工具:SillyTavern

在人工智能&#xff08;AI&#xff09;领域&#xff0c;角色扮演&#xff08;Roleplay&#xff09;无疑是一个富有趣味且充满潜力的应用场景。无论你是AI爱好者还是开发者&#xff0c;找到一个合适的前端工具来访问并与语言模型进行互动是至关重要的。今天&#xff0c;我们将介…

[2024_08_12日志]ONNX Runtime的使用

问题&#xff1a;Segmentation 错误。在 C API 上使用自定义 onnx 模型运行。模型在 Python 上按预期工作&#xff0c;但在 C API 上运行相同的模型时&#xff0c;会收到一个分段错误 python的模型代码如下&#xff1a; class Facenet(nn.Module):def __init__(self, backbone…

lvs详解及实例配置

目录 1.什么是负载均衡 1.1为什么用负载均衡 1.2.负载均衡类型 1.2.1.四层负载均衡 1.2.2.七层负载均衡 1.3 四层和七层的区别 2.LVS介绍 2.1LVS 的优势与不足 2.2LVS 核心组件和专业术语 3.ipvsadm命令 4.LVS集群中的增删改 4.1.管理集群服务中的增删改 4.2.管理集…

C:每日一题:单身狗

​​​​ 一、题目&#xff1a; 在一个整型数组中&#xff0c;只有一个数字出现一次&#xff0c;其他数组都是成对出现的&#xff0c;请找出那个只出现一次的数字。 整型数组 int arr[ ] {1,1,2,2,3,4,4} 二、思路分析&#xff1a; 1.&#xff0c;明确目标&#xff0c;选择…

【linux】nvidia AGX orin 多方法开机自启 .sh 文件

背景&#xff1a; 安装搜狗输入法时候&#xff0c;发现etc/xdg/autostart路径下写desktop文件的方式&#xff0c;于是把所有方案整理一下 为了让 .sh 文件在用户登录时自动执行&#xff0c;可以采用如下多种方法。 1. 使用 .desktop 文件 创建一个 .desktop 文件&#xff0c;将…

链表的奇偶节点重新排列及空指针问题分析【链表、空指针】

在处理链表问题时&#xff0c;重组链表节点是一种常见需求。本文将详细探讨如何在链表中将奇数索引节点放在偶数索引节点之前&#xff0c;并深入分析实现过程中的空指针问题及其解决方案。 1. 问题描述 给定一个单链表&#xff0c;要求将链表中的节点按照奇数索引节点在前、偶…