【JAVA】类加载过程,以及类加载器

类加载过程,以及类加载器

    • 一、类加载的过程
    • 二、类加载器介绍
    • 三、跨类加载
    • 三、举例说明

一、类加载的过程

类加载是Java虚拟机(JVM)将类文件加载到内存中并转换成对应的类对象的过程。它确保了类文件能够正确加载并转换成可执行的类对象,为程序的执行提供了必要的基础设施。类加载过程主要包括以下几个步骤:
在这里插入图片描述

  • 加载(Loading):加载是指将类的字节码文件(.class文件)从磁盘或者网络中读取到内存中的过程。类加载器根据类的全限定名(Fully Qualified Name)来定位和加载类文件。加载过程不包括对类文件的解析和验证,仅仅是将字节码加载到内存中形成类对象的初始状态。
  • 验证(Verification):验证是指对加载的类文件进行字节码验证、符号引用验证等过程,确保类文件的格式和内容符合Java虚拟机规范,防止恶意代码或者不规范的代码对系统造成安全漏洞或者错误。
  • 准备(Preparation):准备是指为类的静态变量分配内存空间,并设置默认初始值的过程。在准备阶段,静态变量会被初始化为默认值,例如整数类型的默认值是0,引用类型的默认值是null。
  • 解析(Resolution):解析是指将类中的符号引用转换为直接引用的过程。在Java中,类的方法调用、字段访问等操作都是通过符号引用来实现的,解析阶段将这些符号引用转换为实际内存地址,使得程序可以直接访问类的方法和字段。
  • 初始化(Initialization):初始化是指执行类的初始化代码(静态代码块和静态变量赋值语句)的过程。在初始化阶段,JVM会按照类加载的先后顺序依次执行静态代码块和静态变量赋值语句,完成类的初始化工作。

需要注意的是,类加载过程是按需进行的,并不是一次性加载所有类文件。当程序需要使用某个类时,类加载器会先加载该类及其所依赖的类,然后进行验证、准备、解析和初始化操作。类加载器会按照委派模型逐级向上委托加载类,直到找到合适的类加载器为止。

对于已经加载的类会被放在 ClassLoader 中。在类加载的时候,系统会首先判断当前类是否被加载过。已经被加载的类会直接返回,否则才会尝试加载。也就是说,对于一个类加载器来说,相同二进制名称的类只会被加载一次。
在这里插入图片描述

下面这个截图是ClassLoader类,里面有一个Vector变量用来存由这个类加载器加载的类。
在这里插入图片描述

二、类加载器介绍

具体来说,Java虚拟机中的类加载器主要分为以下几种:

  • 启动类加载器(Bootstrap Class Loader):负责加载Java的核心类库,例如java.lang.Object等。
  • 扩展类加载器(Extension Class Loader):负责加载Java的扩展类库,例如java.lang.String等。
  • 应用程序类加载器(Application Class Loader):也称为系统类加载器,负责加载应用程序的类,例如项目中自定义的类。
  • 自定义类加载器:开发者可以根据需要编写自定义的类加载器,用于加载特定的类或者资源。

三、跨类加载

跨类加载器指的是在Java虚拟机(JVM)中存在多个类加载器,这些类加载器可能会加载同一个类,导致在内存中存在多个版本的类实例。这种情况下,如果涉及到静态变量,可能会出现静态变量在不同类加载器加载的类中存在多份实例的情况

当存在多个类加载器时,如果不同的类加载器加载了同一个类,就会出现类实例的多个版本。对于静态变量,它们属于类级别的变量,在类加载时被初始化,因此不同类加载器加载的同一个类中的静态变量会有不同的实例。

这种情况下,如果静态变量被跨类加载器共享,可能会导致数据不一致的问题。因此,在设计应用程序时,需要考虑到类加载器的影响,合理使用静态变量,避免跨类加载器共享静态变量可能带来的问题。

三、举例说明

假设有一个简单的Java应用程序,其中包含一个类 MyClass,以及一个静态变量myStaticVariable,同时存在两个不同的类加载器A和B。

public class MyClass {
    public static int myStaticVariable = 0;

    public static void main(String[] args) {
        MyClass.myStaticVariable = 10;
        System.out.println("静态变量值:" + MyClass.myStaticVariable);
    }
}

现在,我们假设类加载器A加载了MyClass 类,而类加载器B也加载了同一个 MyClass 类。由于静态变量属于类级别的变量,因此每个类加载器都会为静态变量myStaticVariable分别创建一个实例。

假设在类加载器A中的MyClass类中修改了静态变量的值:

public class MyClass {
    public static int myStaticVariable = 0;

    static {
        myStaticVariable = 20;
    }

    public static void main(String[] args) {
        System.out.println("静态变量值:" + MyClass.myStaticVariable);
    }
}

而在类加载器B中的MyClass类中没有修改静态变量的值:

public class MyClass {
    public static int myStaticVariable = 0;

    public static void main(String[] args) {
        System.out.println("静态变量值:" + MyClass.myStaticVariable);
    }
}

那么,当在不同的类加载器中运行这两个版本的MyClass类时,会得到不同的输出结果:

在类加载器A中运行时,输出结果为"静态变量值:20",因为在类加载时,静态代码块将静态变量myStaticVariable的值设置为20。
在类加载器B中运行时,输出结果为"静态变量值:0",因为没有修改静态变量的值,保持默认值0。
这种情况下,就展示了静态变量在跨类加载器情况下可能出现的多份实例的情况。

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

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

相关文章

SpringSecurity源码分析(RemeberMe)

RememberMeServices RememberMeServices 记住我的服务的接口 可以重写实现自己的记住我 public interface RememberMeServices { //建议 org. springframework. security. authentication. RememberMeAuthenticationToken 在大多数情况下使用它,因为它具有相应的身份…

如何在您的WordPress网站上安装和设置Yoast seo?

本周有一个客户,购买Hostease的虚拟主机,询问我们的在线客服,如何在您的WordPress网站上安装和设置Yoast seo?我们为用户提供相关教程,用户很快解决了遇到的问题。在此,我们分享这个操作教程,希望可以对您…

如何利用AI技术提升内容生产的效率和质量

目录 前言1 自动化内容生成1.1 文章生成1.2 视频制作1.3 音频合成 2 内容分发与推广2.1 智能内容推荐2.2 社交媒体管理 3 内容分析与优化3.1 用户反馈分析3.2 内容效果评估 结语 前言 在当今数字化时代,人工智能(AI)技术对内容生产、分发和优…

Linux:进程通信(三)信号的捕捉

目录 一、信号捕捉函数 1、signal函数 2、sigaction函数 二、用户态与内核态 1、用户态 2、内核态 用户态与内核态转换 三、volatile关键字 四、SIGCHLD信号 一、信号捕捉函数 1、signal函数 signal函数是C语言标准库中的一个函数,用于处理Unix/Linux系…

数据结构——二叉排序树

懒猫老师-数据结构-(58)二叉排序树的删除(二叉查找树)_哔哩哔哩_bilibili 概念 (1)若它的左子树不空,则左子树上所有结点的值均小于根结点的值; (2)若它的右子树不空,则右子树上所有结点的值均大于根结点的值; (3)它的左右子树也都是二叉排序树。 通…

顶级开源Kubernetes管理工具有哪些?好用Kubernetes工具推荐

Kubernetes已经成为容器编排领域颠覆性的技术,而充满活力的开源社区是其成功背后的推动力。本文将为大家推荐好用的Kubernetes工具,围绕Kubernetes发展的生态系统的广度和深度。 从自动化和监控到网络和安全性,这些工具为管理容器化应用程序…

Python入门到精通,一个月就够了!前字节大佬超详细系统学习路线

毫无疑问,Python 是当下最火的编程语言之一。 对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握 Python 看似是一件十分困难的事。 感觉很迷茫?学了一段时间还是不入流?很大一部分原因是因为你没有一个完整的知识体系&…

WebSocket 来单提醒和客户催单功能

一:WebSocket : WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输。 HTTP协议和WebSocket协议对比&#…

c 双向链表

图片 #include <stdio.h> #include <stdlib.h> #include <string.h>int main(void){ struct film{char name[20];int id;struct film *pre; //前向指针struct film *next; //后向指针 };struct film *headNULL;struct film *ls,*lspre,*work;in…

《幻兽帕鲁》怎么建立服务器,一文学会

你是否厌倦了《幻兽帕鲁》游戏中的公共服务器&#xff0c;想要与好友们共同打造一个专属的游戏世界&#xff1f;本文将为你提供一份极简的服务器搭建指南&#xff0c;让你仅需轻点三次鼠标&#xff0c;3秒轻松开服&#xff0c;与朋友们一同开启“抓帕鲁”的冒险之旅&#xff01…

挖掘线下潜力:Xinstall为App推广开辟新渠道

在移动互联网时代&#xff0c;App的推广成为了企业营销的重要环节。然而&#xff0c;线上推广渠道日益拥堵&#xff0c;成本不断攀升&#xff0c;让许多开发者开始寻找线下推广的新机会。此时&#xff0c;Xinstall作为国内专业的App全渠道统计服务商&#xff0c;为开发者提供了…

Bert 实现情感分析任务

BERT Bert &#xff08;Bidirectional Encoder Representations from Transformers&#xff09;预训练模型是 Google 2018开源的自然语言模型&#xff0c;主要有以下特点。 像它名字一样&#xff0c;BERT最显著的特点是其能够为文本中的每个标记考虑双向上下文。与传统的基于…

STM32G030C8T6:EEPROM读写实验(I2C通信)

本专栏记录STM32开发各个功能的详细过程&#xff0c;方便自己后续查看&#xff0c;当然也供正在入门STM32单片机的兄弟们参考&#xff1b; 本小节的目标是&#xff0c;系统主频64 MHZ,采用高速外部晶振&#xff0c;实现PB11,PB10 引脚模拟I2C 时序&#xff0c;对M24C08 的EEPRO…

面试常见 | 项目上没有亮点,如何包装?

很多技术人在公司用的老技术&#xff0c;而且很多都是搬业务代码且做枯燥乏味的CRUD&#xff0c;在面试提交简历或做自我介绍的时候并不突出&#xff0c;这种情况&#xff0c;如何破局&#xff1f; 首先不管你做的啥项目&#xff0c;全世界不可能只有你自己在做&#xff0c;比…

【MATLAB源码-第52期】基于matlab的4用户DS-CDMA误码率仿真,对比不同信道以及不同扩频码。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 DS-CDMA (Direct Sequence Code Division Multiple Access) 是一种多址接入技术&#xff0c;其基本思想是使用伪随机码序列来调制发送信号。DS-CDMA的特点是所有用户在同一频率上同时发送和接收信息&#xff0c;但每个用户使…

Leetcode—1396. 设计地铁系统【中等】

2024每日刷题&#xff08;127&#xff09; Leetcode—1396. 设计地铁系统 实现代码 class UndergroundSystem { public:typedef struct Checkin {string startStation;int time;} Checkin;typedef struct Checkout{int tripNum;int totalTime;} Checkout;UndergroundSystem()…

ANSI转义序列

一、ASCII码 ASCII&#xff08;American Standard Code for Information Interchange&#xff0c;美国信息交换标准代码&#xff09;最初的设计是一个7位的字符编码&#xff0c;使用了从0到127的数字来表示字符。这意味着它总共可以表示128个不同的字符。这包括了英文大小写字…

vue+ant-design+formBuiler表单构建器——技能提升——form design——亲测有效

最近看到后端同事在弄一个后台管理系统&#xff0c;额&#xff0c;前端真的是夹缝中生存啊&#xff0c;AI抢饭碗&#xff0c;后端也想干前端的活儿。。。 他用到了表单构建器&#xff0c;具体效果如下: 网上有很多适用于ElementUi和ant-design的form design插件&#xff0c;下…

深度学习Day-16:实现天气预测

&#x1f368; 本文为&#xff1a;[&#x1f517;365天深度学习训练营] 中的学习记录博客 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] 要求&#xff1a;根据提供的数据集对RainTomorrow进行预测 一、 基础配置 语言环境&#xff1a;Python3.7编译器选择…

CSS伪类选择器

目录 前言&#xff1a; 链接伪类&#xff1a; 用户行为伪类&#xff1a; 元素状态伪类&#xff1a; 结构化伪类&#xff1a; 否定伪类&#xff1a; 目标伪类&#xff1a; 输入伪类&#xff1a; 前言&#xff1a; 在CSS中有一种特殊的选择器&#xff1a;伪类选择器&…
最新文章