Java 类加载过程

什么是类加载

    Java 类加载是指将 Java 字节码文件加载到 Java 虚拟机(JVM)中,并将其转化为可以执行的可执行代码的过程。当 Java 程序在运行时引用某个类时,JVM 会首先检查是否已经加载该类,如果没有加载,则会通过类加载器加载该类。

类加载器负责加载字节码文件(.class 文件)到 JVM 内存中,并生成一个 java.lang.Class 对象,该对象包含了类的所有信息。类加载器主要完成以下三个步骤:

  1. 加载:查找并加载类的字节码文件。类加载器根据类的名称来查找字节码文件,然后将字节码文件加载到内存中。

  2. 链接:将类的字节码文件链接为可执行的代码。链接过程包括验证、准备(为静态变量分配内存并设置初始值)、解析(将字节码中的符号引用转换为直接引用)等。

  3. 初始化:执行类的初始化代码,包括静态变量的初始化和静态代码块的执行。

类加载器采用了双亲委派模型,即先委派给上层的父类加载器进行加载,如果父类加载器无法加载,则由当前类加载器进行加载。这个机制可以确保类的加载是有序的,并且可以避免重复加载同一个类。

双亲委派模型

      在Java中,类加载器负责将字节码文件加载到内存中并创建对应的Class对象,从而使得Java程序可以使用这些类。双亲委派模型是Java类加载机制的一种设计模式,它通过层次化的类加载器结构来保证类的唯一性和安全性。

具体来说,双亲委派模型的原理如下:

  1. 当程序需要加载一个类时,首先会委托给最顶层的类加载器——启动类加载器(Bootstrap Class Loader)。
  2. 启动类加载器会检查是否能够加载该类,如果能够加载,则直接进行加载;如果不能加载,则将加载请求委托给扩展类加载器(Extension Class Loader)。
  3. 扩展类加载器会检查是否能够加载该类,如果能够加载,则直接进行加载;如果不能加载,则将加载请求委托给应用程序类加载器(Application Class Loader)。
  4. 应用程序类加载器会检查是否能够加载该类,如果能够加载,则直接进行加载;如果不能加载,则抛出ClassNotFoundException异常。

     这种层次化的委派机制使得每个类加载器只负责加载自己负责的类,而不负责加载其他类。这种分工明确的加载机制可以有效地避免类的重复加载和被恶意篡改的风险。      

  1. 启动类加载器(Bootstrap Class Loader)是最顶层的类加载器,它负责加载Java核心类库,例如java.lang包下的类。
  2. 扩展类加载器(Extension Class Loader)是在启动类加载器之后,负责加载Java扩展类库,例如javax包下的类。
  3. 应用程序类加载器(Application Class Loader)是在扩展类加载器之后,负责加载应用程序的类。、
  4. 加载类时的顺序是:启动类加载器 -> 扩展类加载器 -> 应用程序类加载器。

另外,双亲委派模型还有以下几个特点:

  1. 类加载器之间形成了父子关系,每个类加载器都有一个父加载器。子类加载器会首先委托给父加载器进行加载,只有在父加载器无法加载时,才会尝试自己加载。
  2. 父加载器通过委派给子加载器,实现了类加载的向上委托机制。这样可以确保类加载器在加载类时,先从上层类加载器查找,从而保证系统核心库的安全性。
  3. 双亲委派模型中的类加载器是优先加载父类路径下的类,这样可以避免自定义类和Java核心类库的冲突。

     双亲委派模型的原理是通过层次化的类加载器结构,自底向上地查找并加载类,从而保证类的唯一性和安全性。这种设计模式在Java中被广泛应用,能够有效避免类的重复加载和被篡改的风险,提高了系统的稳定性和安全性。

Java 类加载过程

     

Java类加载的过程可以分为以下7个步骤:

  1. 加载(Load):加载是类加载过程的第一步。在这一步,Java虚拟机会根据类的全限定名(包括包路径)查找并加载类的二进制数据,并将其存放在方法区(Java 8之前)或元空间(Java 8及以后)中。类的二进制数据可以来自于多种来源,如本地文件系统、网络、ZIP压缩文件等。

  2. 验证(Verify):验证是加载过程的第二步。在这一步,Java虚拟机会对类的二进制数据进行合法性校验,确保其符合Java虚拟机规范。验证过程包括文件格式验证、元数据验证、字节码验证和符号引用验证。

  3. 准备(Prepare):准备是加载过程的第三步。在这一步,Java虚拟机会为类的静态变量分配内存,并设置默认初始值。静态变量存放在方法区(Java 8之前)或元空间(Java 8及以后)中。

  4. 解析(Resolve):解析是加载过程的第四步。在这一步,Java虚拟机会将类、接口、字段和方法的符号引用解析为直接引用。符号引用是一种符号化的引用,直接引用是可以直接指向内存中的对象。

  5. 初始化(Initialize):初始化是加载过程的第五步。在这一步,Java虚拟机会对类的静态变量进行赋值和静态代码块的执行。初始化是类被首次主动使用时触发的,包括以下情况:创建类的实例、调用类的静态方法、访问类的静态变量、反射调用类的方法和字段,以及初始值为常量的静态变量(编译期常量)。

  6. 使用(Use):使用是加载过程的第六步。在这一步,Java虚拟机会根据需要使用类,执行相应的字节码指令。使用的过程中可以触发类的初始化。

  7. 卸载(Unload):卸载是加载过程的最后一步。在这一步,Java虚拟机会卸载不再使用的类。类的卸载通常是由Java虚拟机的垃圾回收器判断并触发的,判断标准包括:类的实例被全部回收、类的ClassLoader被回收、类的引用被全部清除。

下面是一个简单的示例代码,用于演示类加载过程的几个阶段:

public class MyClass {// 静态变量public static int count = 0;// 静态代码块static {System.out.println("静态代码块执行");count = 10;}// 静态方法public static void printCount() {System.out.println("count = " + count);}public static void main(String[] args) {MyClass.printCount();}
}

运行上述代码,可以看到输出结果为:

静态代码块执行
count = 10

可以看出,类的加载过程中,静态代码块在准备阶段进行赋值,然后在初始化阶段执行。

总结 

  1. 加载:在该阶段,类的字节码文件被加载到内存中,并被存储在方法区中的运行时常量池内。

  2. 验证:在验证阶段,对字节码文件的合法性进行检查,以确保它满足Java虚拟机的规范要求,并且不会对虚拟机产生安全风险。

  3. 准备:在准备阶段,为类的静态变量分配内存,并设置默认初始值。

  4. 解析:在解析阶段,将常量池中的符号引用转换为直接引用。

  5. 初始化:在初始化阶段,对类的静态变量进行初始化,并执行静态代码块。

  6. 使用:在使用阶段,类被加载到内存中,并可以被其他类引用和使用。

  7. 卸载:在卸载阶段,当类或类的ClassLoader不再被引用时,类被从内存中卸载。

注意:类的加载过程是按需进行的,即只有在使用到该类时才会触发加载过程。

  

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

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

相关文章

ue5地编模块学习记录

ue5网站功能3d溜溜网下载模型https://anyconv.com/max-to-fbx-converter/3dmax转换fbx模型解决问题记录 一、光源 搜索光源搜索不到的时候可以点击 窗口> 对场景内的光照进行处理

【Java】数组训练案例

训练案例1 需求描述: 定义一个含有五个元素的数组,并为每个元素赋值,求数组中所有元素的最小值。 操作步骤描述: 1) 定义5个元素数组。 2) 可以使用初始化数组的两种方式之一为数组元素赋值。 3&#xff09…

最佳解决Maven同一依赖多版本共存问题,重复依赖(同一个jar包,多个版本)-maven-shade-plugin

先看链接:原文链接 参照原文链接生成的文件(下面是我放的位置) mvn指令 mvn install:install-file -DfileD:\mavenrepository/maven-shade.jar -DgroupIdcom.wj -DartifactIdmaven-shade -Dversion1.1 -Dpackagingjar如果配置了maven_home 和java_home可以任意打开cmd执行(…

Google: 在新知识上微调大语言模型是否会鼓励产生幻觉?

摘要 当大型语言模型通过监督式微调进行对齐时,它们可能会遇到在预训练期间没有获得的新事实信息。人们经常推测,这可能会教导模型产生事实上不正确的回应的行为,因为模型被训练成生成没有基于其预先存在的知识的事实。在这项工作中,Google研究了这种暴露在新知识下对微调后模…

基于springboot实现高校教师电子名片系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现高校教师电子名片系统演示 摘要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,名片信息因为其管理内容繁杂&#xff…

C++的数据结构(五):树和存储结构及示例

在计算机科学中,树是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。这种数据结构以一系列连接的节点来形成树形结构。在C中,树的概念和存储结构是实现各种复杂算法和…

Java--初识类和对象

前言 本篇讲解Java类和对象的入门版本。 学习目的: 1.理解什么是类和对象。 2.引入面向对象程序设计的概念 3.学会如何定义类和创建对象。 4.理解this引用。 5.了解构造方法的概念并学会使用 考虑到篇幅过长问题,作者决定分多次发布。 面向对象的引入 J…

Docker之grep: (standard input): binary file matches

使用 docker compose logs -f | grep 命令时遇到了 grep: (standard input): binary file matches 错误。 这个错误通常发生在 grep 尝试搜索包含二进制内容的文件时。docker compose logs 命令会输出容器的日志,而这些日志可能包含二进制数据,导致 gre…

MySQL查询篇-集合运算

文章目录 union (并集)union distinctunion all intersect(交集)intersect allintersect distinct except 差集except distinctexcept distinctexcept all union (并集) union distinct 使用前提:a和c数据类型一致&a…

互联网摸鱼日报(2024-05-13)

互联网摸鱼日报(2024-05-13) 36氪新闻 当绿色飞行成为潮流,这家航空公司定下了新目标 | 最前线 回收雨水浇花,厨余垃圾变肥料,我们打卡了阿里北京新园区 | 最前线 本周双碳大事:中美就气候问题进行会谈;锂电池行业迎…

GIAT: 蛋白质结构预测的新利器

瑞典Karolinska研究院在瑞典政府赞助下由Ben Murrell等研究团队在AlphaFold 3最新报告后提出这篇论文提出了一种非常有趣和创新的方法来生成蛋白质骨架结构,称为生成式不变角度转换器(GIAT)。与现有的主要基于扩散模型和流匹配的方法不同,GIAT采用了类似于大型语言模型(如GPT)中…

【C语言|数据结构】双向链表

文章目录 前言1、初步认识双向链表1.1 定义:1.2 结构1.3 节点的存储 2、双向链表的接口函数2.1 链表的节点的动态申请2.2 链表的初始化2.3 尾插2.4 头插2.5 头删2.5 尾删2.6 在pos节点后面添加数据2.6 删除pos节点 3、双向链表的实现: 前言 各位小伙伴大…

C控制语句:分支和跳转

1.1if语句 //colddays.c --找出0摄氏度以下的天数占总天数的百分比 #include <stdio.h>int main(void) {const int FREEZING 0;float temperature;int cold_days 0;int all_days 0;printf("Enter the list of daily low temperature.\n");printf("Use…

电子学会C/C++编程等级考试2024年03月(八级)真题解析

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;道路 N个以 1 … N 标号的城市通过单向的道路相连:。每条道路包含两个参数&#xff1a;道路的长度和需要为该路付的通行费&#xff08;以金币的数目来表示&#xff09; Bob and Alice 过去住在城市 1.在…

蓝海创业商机小吃配方项目,日入200+ ,小白可上手,图文创作转现快

小吃技术销售&#xff0c;一单价格从几元到几百元不等&#xff0c;行业竞争相对较小&#xff0c;是一个相对冷门的领域。只需一部手机&#xff0c;就可以发布图文并茂的内容&#xff0c;配上背景音乐&#xff08;BGM&#xff09;&#xff0c;即使是对视频剪辑不熟悉的新手&…

面试中算法(金矿)

有一位国王拥有5座金矿&#xff0c;每座金矿的黄金储量不同&#xff0c;需要参与挖掘的工人人数也不同。 例如&#xff0c;有的金矿储量是5ookg黄金&#xff0c;需要5个工人来挖掘;有的金矿储量是2ookg黄金&#xff0c;需要3个工人来挖掘...... 如果参与挖矿的工人的总数是10。…

【Oracle impdp导入dmp文件(windows)】

Oracle impdp导入dmp文件&#xff08;windows&#xff09; 1、连接数据库2、创建与导出的模式相同名称的用户WIRELESS2&#xff0c;并赋予权限3、创建directory 的物理目录f:\radio\dmp&#xff0c;并把.dmp文件放进去4、连接新用户WIRELESS25、创建表空间的物理目录F:\radio\t…

试衣不再有界:Tunnel Try-on开启视频试衣应用新纪元

论文&#xff1a;https://arxiv.org/pdf/2404.17571 主页&#xff1a;https://mengtingchen.github.io/tunnel-try-on-page/ 一、摘要总结 随着虚拟试衣技术的发展&#xff0c;消费者和时尚行业对于能够在视频中实现高质量虚拟试衣的需求日益增长。这项技术允许用户在不实际穿…

目标检测——印度车辆数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

弱监督语义分割学习笔记

目录 partial cross entropy loss GitHub - LiheYoung/UniMatch: [CVPR 2023] Revisiting Weak-to-Strong Consistency in Semi-Supervised Semantic Segmentation partial cross entropy loss import torch import torch.nn.functional as Fdef partial_cross_entropy_loss…