JVM加载Class文件的原理机制

该文章转载自[url]http://simpleframework.net/blog/v/91733.html[/url]

1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中

2.java中的类大致分为三种:

1.系统类

2.扩展类

3.由程序员自定义的类

3.类装载方式,有两种

1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中,

2.显式装载, 通过class.forname()等方法,显式加载需要的类

隐式加载与显式加载的区别?两者本质是一样?

4.类加载的动态性体现

一个应用程序总是由n多个类组成,Java程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载,这样的好处是节省了内存的开销,因为java最早就是为嵌入式系统而设计的,内存宝贵,这是一种可以理解的机制,而用到时再加载这也是java动态性的一种体现

5.java类装载器

Java中的类装载器实质上也是类,功能是把类载入jvm中,值得注意的是jvm的类装载器并不是一个,而是三个,层次结构如下:

Bootstrap Loader - 负责加载系统类

|

- - ExtClassLoader - 负责加载扩展类

|

- - AppClassLoader - 负责加载应用类

为什么要有三个类加载器,一方面是分工,各自负责各自的区块,另一方面为了实现委托模型



6. 类加载器之间是如何协调工作的

前面说了,java中有三个类加载器,问题就来了,碰到一个类需要加载时,它们之间是如何协调工作的,即java是如何区分一个类该由哪个类加载器来完成呢。

在这里java采用了委托模型机制,这个机制简单来讲,就是“类装载器有载入类的需求时,会先请示其Parent使用其搜索路径帮忙载入,如果Parent 找不到,那么才由自己依照自己的搜索路径搜索类”,注意喔,这句话具有递归性

下面举一个例子来说明,为了更好的理解,先弄清楚几行代码:

public class Test{

public static void main(String[] arg){

ClassLoader c = Test.class.getClassLoader(); //获取Test类的类加载器

System.out.println(c);

ClassLoader c1 = c.getParent(); //获取c这个类加载器的父类加载器

System.out.println(c1);

ClassLoader c2 = c1.getParent();//获取c1这个类加载器的父类加载器

System.out.println(c2);

}

}


运行结果:
1
2
3
4

sun.misc.Launcher$AppClassLoader@addbf1

sun.misc.Launcher$ExtClassLoader@42e816
null


可以看出Test是由AppClassLoader加载器加载的

AppClassLoader的Parent 加载器是 ExtClassLoader 但是ExtClassLoader的Parent为 null 是怎么回事呵,如果留意的话,前面有提到Bootstrap Loader是用C++语言写的,依java的观点来看,逻辑上并不存在Bootstrap Loader的类实体,所以在java程序代码里试图打印出其内容时,我们就会看到输出为null



类装载器ClassLoader(一个抽象类)描述一下JVM加载class文件的原理机制

类装载器就是寻找类或接口字节码文件进行解析并构造JVM内部对象表示的组件,在java中类装载器把一个类装入JVM,经过以下步骤:

1、装载:查找和导入Class文件

2、链接:其中解析步骤是可以选择的

(a)检查:检查载入的class文件数据的正确性

(b)准备:给类的静态变量分配存储空间

(c)解析:将符号引用转成直接引用

3、初始化:对静态变量,静态代码块执行初始化工作

类装载工作由ClassLoder和其子类负责。

JVM在运行时会产生三个ClassLoader:根装载器,ExtClassLoader(扩展类装载器)和AppClassLoader

其中根装载器不是ClassLoader的子类,由C++编写,因此在java中看不到他,负责装载JRE的核心类库,如JRE目录下的rt.jar,charsets.jar等。

ExtClassLoader是ClassLoder的子类,负责装载JRE扩展目录ext下的jar类包;

AppClassLoader负责装载classpath路径下的类包,这三个类装载器存在父子层级关系,即根装载器是ExtClassLoader的父装载器,ExtClassLoader是AppClassLoader的父装载器。默认情况下使用AppClassLoader装载应用程序的类



Java装载类使用“全盘负责委托机制”。

“全盘负责”是指当一个ClassLoder装载一个类时,除非显示的使用另外一个ClassLoder,该类所依赖及引用的类也由这个ClassLoder载入;

“委托机制”是指先委托父类装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。这一点是从安全方面考虑的,试想如果一个人写了一个恶意的基础类(如java.lang.String)并加载到JVM将会引起严重的后果,但有了全盘负责制,java.lang.String永远是由根装载器来装载,避免以上情况发生

除了JVM默认的三个ClassLoder以外,第三方可以编写自己的类装载器,以实现一些特殊的需求。类文件被装载解析后,在JVM中都有一个对应的java.lang.Class对象,提供了类结构信息的描述。数组,枚举及基本数据类型,甚至void都拥有对应的Class对象。Class类没有public的构造方法,Class对象是在装载类时由JVM通过调用类装载器中的defineClass()方法自动构造的



ClassLoader重要方法:

(1)public Class<?> loadClass(String name) throws ClassNotFoundException

name参数指定类装载器需要装载类的名字,必须使用全限定类名。

该方法有一个重载方法loadClass(String name,Boolean resolve),resolve参数告诉类装载器是否解析该类。在初始化类之前应考虑进行类解析的工作,但并不是所有类都需要解析,如果JVM只需要知道该类是否存在或找出该类的超类,那么就不需要进行解析
littlefs系列:wear leveling wear leveling的功能是通过block alloctor实现的。littlefs通过两个方法实现磨损均衡: 1) 检测和恢复bad blocks 2)通过dynamic blocks均衡磨损 检测和恢复bad blocks和block alloctor的关系并不紧密,主要依靠文件系统本身来检测坏块并标记。在littlefs中,检测坏块主要是通过写后回读并比较的方式实现的,如果数据不一致则说明是一个坏块。一旦检测到了坏块就要进行恢复。 如果是写入错误,因为数据才RAM中还有备份,因此需. 阅读详情

相关推荐

第二章 零差云控关节模组内部构造

对零差云控的eRob70I进行了拆解

SFY__优快云的博客 5974

classpath与JVM的关系

classpath 主要是指类的运行路径,实际上在我们执行Java命令时,对于本地的操作系统来说就意味着启动了一个JVM,那么JVM在运行时需要通过classpath夹在所需要的类,而默认的情况下classpath 是指向当前目录的(当前命令行窗口所在的目录)。所以会直接从次目录下查找。 附上 Java环境变量配置: JAVA_HOME : C:\Program Files\Java\jd

The Legend of the Eagle 2560

制造业批次管理中双计量单位动态转换的实践指南

本文详细介绍了制造业批次管理中双计量单位动态转换的实践指南,特别是在SAP系统中的配置与操作步骤。通过实际案例展示了如何解决采购与生产部门计量单位不一致的问题,提升物料管理效率。重点讲解了批次特性配置、移动类型调整及常见问题排查方法,适用于金属加工、化工等多个行业。

weixin_29228203的博客 159

【JVM】JVM加载class文件的原理机制

一、JVM简介 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java语言的一个非常重要的特点就是与平台的 无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,J...

renjingjingya0429的博客 2万+

爬虫:一文掌握 Pydoll 的详细使用(彻底改变浏览器自动化,且能绕过绕过验证码!)

Pydoll正在彻底改变浏览器自动化!与其他解决方案不同,它消除了对Web驱动程序的需求,提供了流畅可靠的自动化体验和本机异步性能。

数据知道的博客 1万+

昇腾,Ascend,NPU,mindie,镜像,部署vllm:第5篇,昇腾环境下部署蒸馏版deepseek-r1,并在dify中注册模型供应商

这两天没少折腾deepseek-r1。之前在A100上用ollama部署了一份DeepSeek-R1-Distill-Qwen-32B,感觉真的特别慢。现在,再用昇腾部署一遍,看看速度能不能更快。p.s. 类似的内容其实已经写了很多遍了。但感觉之前写得都太碎,不够顺畅。接着新模型写篇长文,把能包括的都包括进来。这样大家也不需要到处翻来翻去。

xiezhipu的博客 2450

JVM 加载 class 文件的原理机制

JVM 加载 class 文件的原理机制,包括jvm基础介绍,已经加载流程,双亲委派机制

2301_77207909的博客 1200

YOLO26涨点改进 | 独家创新、损失函数改进篇 | TGRS 2025顶刊 | 带来AIoU小目标涨点损失函数,增强了目标检测中对边界框形状和尺寸的敏感度,适合复杂场景和小物体检测中有效涨点

AIoU损失函数通过自适应形状感知和尺寸敏感加权机制,有效解决了YOLO26原生损失函数在小目标检测中的缺陷。实验结果表明,AIoU损失函数在多个数据集上均取得了显著的性能提升,尤其在小目标检测和多任务场景下表现突出。自适应形状感知,对形状差异较大的目标给予更大惩罚,提高边界框拟合精度尺寸敏感加权,对小目标的宽高比例差异给予更大权重,增强模型对小目标特征的学习能力梯度连续性好,即使在IoU=0时仍能提供有效的梯度更新,解决小目标梯度消失问题。

qq_36130719的博客 159

14. JVM加载class文件的原理机制

文件是Java源代码编译后的字节码文件,而JVM通过类加载机制将这些字节码加载到内存中并运行。文件的生成与JVM类加载机制,是掌握Java程序运行原理、排查类加载相关问题的关键。确保字节码符合JVM规范,防止恶意代码破坏虚拟机。变量)分配内存并赋初始值(零值)。文件加载到内存,并生成对应的。文件是Java源代码(通过类的全限定名(如。(内存地址或句柄)。

sinat_33739100的博客 1203

化工仿真软件:gPROMS二次开发_(1).gPROMS基础知识

在gPROMS中,模型是通过定义变量、参数和方程来创建的。模型可以是简单的单元操作,如换热器、反应器,也可以是复杂的系统,如整个化工流程。变量是模型中表示状态或输出的量。在gPROMS中,变量需要显式定义其类型和单位。# 定义变量VAR# 温度变量,单位为K# 压力变量,单位为Pa# 组分摩尔分数,数组变量参数是模型中表示常量或初始条件的量。参数同样需要定义其类型和单位。# 定义参数PAR# 理想气体常数,单位为J/(mol·K)# 反应器体积,单位为m^3# 初始摩尔数。

kkchenjj的博客 617

lammps原子组速度的计算方法

在lammps摩擦、冲击、压痕等模拟过程中,涉及到某个原子组的整体移动,如果要输出这个原子组的整体移动速度,可以使用vcm()函数。下面是一个具体的使用案例,金刚石球在盒子内移动,输出移动过程中金刚石球在x方向的质心速度。vcm()是lammps自带的一个函数,返回原子组质心在设定方向的速度。其中,ID为group-ID,dim为方向,可设置x、y或者z方向。大家好,我是小马老师。

lammps_jiayou的博客 343

描述一下 JVM 加载 Class 文件的原理机制

JVM 加载 Class 文件的原理机制涉及多个步骤和组件,主要包括类加载器(Class Loader)和类加载过程。

weixin_45422672的博客 999

YOLOv11改进 - C3k2融合 | C3k2融合CBSA 收缩 - 广播自注意力:轻量级设计实现高效特征压缩,优化处理效率 | NeurIPS 2025

本文介绍收缩 - 广播自注意力(CBSA)((Contract-and-Broadcast Self-Attention))机制,并将其集成到YOLOv11中。传统注意力机制存在黑盒难理解、计算复杂度高的问题,CBSA通过算法展开推导出本质上可解释且高效的注意力机制。它先从输入数据中选出少量代表性tokens,接着对代表进行收缩计算,再将结果广播给所有原始数据。该机制计算量线性增长,具有明确数学解释,还能统一多种注意力机制。我们将CBSA代码集成到YOLOv11的C3k2模块中。实验证明,改进后的YOLOv

魔改工程师的博客 852

描述一下JVM加载class文件的原理机制?

用户可以通过继承类,实现自己的类加载器,以满足特定需求(如加载加密的类文件或从数据库中加载类)。

weixin_45990682的博客 931

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

描述一下JVM加载class文件的原理机制

Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。 类装载方式,有两种 : 1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载...

weixin_30484739的博客 197

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

JVM加载class文件的原理机制

JVM加载class文件的原理机制

m0_50744075的博客 507

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

62、描述一下JVM加载class文件的原理机制?

61、描述一下JVM加载class文件的原理机制? JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。 它负责在运行时查找和装入类文件的类。 JAVA面试问题及答案大全 ...

kaszxc的博客 263

Java进阶——JVM加载class文件的原理机制

回到顶部。

m0_67402564的博客 476

Java提高篇——JVM加载class文件的原理机制

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。

pleaseprintf的博客 703

8. JVM加载class文件的原理机制

JVM加载class文件的原理机制

sinat_33739100的博客 115
上一篇: 简单的JQuery(AJAX)+SpringMVC的小例子(JSON)
下一篇: 正则表达式统计字符串出现的次数
水滴石穿
博客等级 码龄16年 1粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值