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

JVM加载class文件的原理机制 收藏
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);
}
}
把以上代码存到d:\my 文件夹下,直接编译,然后在dos模式下运行
D:\my\java Test
。。。AppClassLoader。。。
。。。ExtClassLoader。。。
Null

D:\my

注: 。。。表示省略了内容
可以看出Test是由AppClassLoader加载器加载的
AppClassLoader的Parent 加载器是 ExtClassLoader

但是ExtClassLoader的Parent为 null 是怎么回事呵,朋友们留意的话,前面有提到Bootstrap Loader是用C++语言写的,依java的观点来看,逻辑上并不存在Bootstrap Loader的类实体,所以在java程序代码里试图打印出其内容时,我们就会看到输出为null
【注:以下内容大部分引用java深度历险】
弄明白了上面的示例,接下来直接进入类装载的委托模型实例,写两个文件,如下:
文件:Test1.java
Public class Test1{
Public static void main(String[] arg){
System.out.println(Test1.class.getClassLoader());
Test2 t2 = new Test2();
T2.print();
}
}

文件: Test2.java
Public class Test2{
Public void prin(){
System.out.println(this.getClass().getClassLoader());
}
}

这两个类的作用就是打印出载入它们的类装载器是谁, 将这两个文件保存到d:\my目录下,编译后,我们在复制两份,分别置于 <JRE所在目录>\classes下(注意,刚开始我们的系统下没有此目录,需自己建立) 与 <JRE所在目录>\lib\ext\classes下(同样注意,开始我们的系统下也没此目录,手工建立), 然后切换到d:\my目录下开始测试,

测试一:
<JRE所在目录>\classes下
Test1.class
Test2.class

<JRE所在目录>\lib\ext\classes下
Test1.class
Test2.class

D:\my下
Test1.class
Test2.class


dos下输入运行命令,结果如下:
D:\my>java Test1
Null
Null

D:\my>

从输出结果我们可以看出,当AppClassLoader要载入Test1.class时,先请其Parent,也就是ExtClassLoader来载入,而ExtclassLoader又请求其Parent,即Bootstrap Loader来载入Test1.class. 由于 <JRE所在目录>\Classes目录为Bootstrap Loader的搜索路径之一,所以Bootstrap Loader找到了Test1.class,因此将它载入,接着在Test1.class之内有载入Test2.class的需求,由于 Test1.class是由Bootstrap Loader所载入,所以Test2.class内定是由Bootstrap Loader根据其搜索路径来找,因Test2.class也位于Bootstrap Loader可以找到的路径下,所以也被载入了,最后我们看到Test1.class与Test2.class都是由Bootstrap Loader(null)载入。


测试二:
<JRE所在目录>\classes下
Test1.class

<JRE所在目录>\lib\ext\classes下
Test1.class
Test2.class

D:\my下
Test1.class
Test2.class

dos下输入运行命令,结果如下:
D:\my>java Test1
Null
Exception in thread “main” java.lang.NoClassdefFoundError:Test2 at Test1.main。。。
D:\my>

从输出结果我们可以看出,当AppClassLoader要载入Test1.class时,先请其Parent,也就是ExtClassLoader来载入,而ExtclassLoader又请求其Parent,即Bootstrap Loader来载入Test1.class. 由于 <JRE所在目录>\Classes目录为Bootstrap Loader的搜索路径之一,所以Bootstrap Loader找到了Test1.class,因此将它载入,接着在Test1.class之内有载入Test2.class的需求,由于 Test1.class是由Bootstrap Loader所载入,所以Test2.class内定是由Bootstrap Loader根据其搜索路径来找,但是因为Bootstrap Loader根本找不到Test2.class(被我们删除了),而Bootstrap Loader又没有Parent,所以无法载入Test2.class.最后我们看到Test1.class是由Bootstrap Loader(null)载入,而Test2.class则无法载入


测试三
<JRE所在目录>\classes下

Test2.class

<JRE所在目录>\lib\ext\classes下
Test1.class
Test2.class

D:\my下
Test1.class
Test2.class

dos下输入运行命令,结果如下:
D:\my>java Test1
。。。ExtClassLoader。。。
Null

D:\my>

从输出结果我们可以看出,当AppClassLoader要载入Test1.class时,先请其Parent,也就是ExtClassLoader来载入,而ExtclassLoader又请求其Parent,即Bootstrap Loader来载入Test1.class.但是Bootstrap Loader无法在其搜索路径下找到Test1.class(被我们删掉了),所以ExtClassLoader只得自己搜索,因此 ExtClassLoader在其搜索路径 <JRE所在目录>\lib\ext\classes下找到了Test1.class,因此将它载入,接着在Test1.class之内有载入Test2.class的需求,由于Test1.class是由ExtClassLoader所载入,所以Test2.class内定是由 ExtClassLoader根据其搜索路径来找,但是因为ExtClassLoader有Parent,所以先由Bootstrap Loader帮忙寻找,Test2.class位于Bootstrap Loader可以找到的路径下,所以被Bootstrap Loader载入了.最后我们看到Test1.class是由ExtClassLoader载入,而Test2.class则是由Bootstrap Loader(null)载入

了解了以上规则,请朋友们自行分析以下场景的执行结果

测试四:
<JRE所在目录>\classes下


<JRE所在目录>\lib\ext\classes下
Test1.class
Test2.class

D:\my下
Test1.class
Test2.class


测试五:
<JRE所在目录>\classes下


<JRE所在目录>\lib\ext\classes下
Test1.class


D:\my下
Test1.class
Test2.class


测试六:
<JRE所在目录>\classes下


<JRE所在目录>\lib\ext\classes下

Test2.class


D:\my下
Test1.class
Test2.class


测试七:
<JRE所在目录>\classes下


<JRE所在目录>\lib\ext\classes下


D:\my下
Test1.class
Test2.class


以上理解,错漏之处请朋友们及时指出,以免怠误大家


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/alex197963/archive/2009/08/07/4417069.aspx
FCN---训练cityspaces 未经允许,不要随意转载! 最近想试试用FCN训练自己的数据集,想想标注是一件很费劲的事,于是就想到了用其他库里的数据,这里选用了cityspaces,默认已经配置好FCN. 1、下载cityspaces https://www.cityscapes-dataset.com/ 需要注册一个账号 cityspaces包含2... 阅读详情

相关推荐

【阿里云大模型高级工程师ACP学习笔记】2.8 部署模型

【摘要】本文主要分享自学阿里云大模型高级工程师 ACP 认证中《2.8 部署模型》的学习笔记。详细介绍学习目标、梳理涵盖的知识点并评估其重要性和难易度,对既重要又困难的知识点进行重点分析,旨在为对阿里云大模型学习和认证感兴趣的读者提供学习思路和经验参考。

davidkorhenn的博客 2060

JVM加载Class文件的原理机制

点击上方“java大数据修炼之道”,选择“设为星标”优质文章和精品资源,第一时间送达前言了解底层有利于我们去开发项目,废话少说,我们开始吧目录1.原理机制2.类加载器3.类加载器的执...

hello world! 6391

RYU+Mininet的SDN架构-设计校园网络(一)

现有一个中学,需要设计一个中小型网络满足学校的网络需求。学校有教学区,实验室区域和服务器区域。教学区为了满足接入的灵活性和信号强度要求,需要满足设计WIFI满足日常教室和同学需求,接入上限为200人。实验室区域需要有一台教师主机方便管理实验室其余电脑,并且教师主机可以访问学校服务器,方便为同学们实验室授课。学校服务器区域设有学校相关重要文件和学校网页相关内容。最后学校还会接入互联网。

weixin_53284122的博客 8035

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

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

renjingjingya0429的博客 2万+

C++实现设计ATM机系统

这个示例实现了一个基本的ATM机系统,支持注册、登录、存款、取款、查询余额和保存数据等功能。当然,这只是一个简单的ATM机模拟,实际的ATM机系统需要更复杂的逻辑和更严格的安全措施。C++编写一个简单的ATM机系统,我将提供一个基本的实现示例,但由于ATM机系统的复杂性和安全性要求,这只是一个简单的模拟,不适合在实际环境中使用。试设计一简单模拟ATM机系统,系统以菜单方式工作,采用自定义函数设计各功能模块被主菜单调用,使之能提供以下基本选项。=========欢迎使用ATM=========

走向CTO的路上... 1243

Vue2 - 最新实现接入使用天地图及卫星视图切换功能,在国家天地图上自由切换地图显示类型(卫星视图/地形视图/卫星混合/地形混合/普通视图)vue天地图切换视图显示改成卫星风格,切换地图图层完整代码

vue2,nuxt2,天地图,视图,卫星,地图类型切换,vue天地图,改成卫星视角,在线地图切换,来回切换卫星图,天地图如何实现来回切换卫星图,地形图,卫星视图,vue中使用天地图自定义样式切换地图图层,切换报错,加载出错,卫星图太卡,地图图层更换,vue安装集成天地图详细示例源码,切换地图的样式,在天地图中如何将地图的类型随意更换,提供多种视图模式用户自由点击更换,VUE引入天地图卫星版,详细教程示例源码代码,天地图切换卫星用什么api,卫星视角API方法,vue2卫星天地图,能改地图的显示方式,图层类型

🏆 前端领域优质创作者 4142

JVM加载class文件

文章目录一、JVM加载class文件原理二、JVM加载class文件的机制 一、JVM加载class文件原理 原理: 1、JVM中类的加载是由类加载器(ClassLoader)和其子类来实现的。 2、java中的类加载器是一个重要的java运行时系统组件,它负责在运行时查找和装入类文件中的类。 原理分析(一): 1、由于java是跨平台的,经过编译的java源程序并不是一个可执行程序,而是一个或多个类文件。 2、当java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。

qq_32374875的博客 2026

C#操作MySQL从入门到精通(1)——安装MySQL数据库

我们使用C#操作MySQL数据库第一步要做的就是安装MySQL数据库,本文就是详细讲解如何安装MySQL数据库。

qq_34059233的博客 963

JVM加载class文件原理

文章目录1 简单介绍1.1 跨平台运行1.2 编译机制2 类加载机制2.1 加载方式2.2 加载过程2.2.1 加载2.2.2 链接2.2.2.1 验证2.2.2.1.1 文件格式验证2.2.2.1.2 元数据验证2.2.2.1.3 字节码验证2.2.2.1.4 符号引用验证2.2.2.2 准备2.2.2.3 解析2.2.3 初始化2.2.4 类加载总结2.3 类加载时机2.3.1 类初始化的条件2.3.2 对象初始化顺序3 类加载器3.1 了解类加载器3.2 类加载器分类3.3 类加载机制3.3.1 类

上善若泪 3883

自动驾驶感知新方案:YOLOv13多模态(RGB+LiDAR+热成像)融合实战

YOLOv13的RGB+LiDAR+热成像多模态融合方案,解决了自动驾驶感知的鲁棒性问题,通过跨模态特征互补和注意力融合,实现了复杂场景下的高精度检测。本文从架构设计、数据预处理、核心模块实现到车载部署,完成了全流程实战。动态模态权重:根据场景自动调整各模态的权重(如黑夜场景提升热成像权重);端到端3D检测:直接从原始点云与图像进行3D检测,减少预处理步骤;轻量化优化:针对车载设备进一步剪枝量化,提升推理速度。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 534

在 ABAP SEGW OData 服务里,把 Function Import 参数长度校验真正跑起来

SAP Gateway服务中Function Import参数长度校验的实现机制解析:在SEGW中定义Max Length参数后,需通过模型特性USE_STRICT_FUNCTION_PARAM_CHK(7.52+版本支持)启用严格检查。该特性需在MPC_EXT的DEFINE方法中设置,框架会在URI解析阶段拦截超长参数,避免错误进入业务逻辑。对于低版本系统,建议在应用层手动添加校验。这种模型驱动的方式符合Clean Core原则,能有效提升接口健壮性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 493

转 JVM加载Class文件的原理机制

1.java中的所以类,必须被加载到JVM中才能运行,这个加载是由类加载器完成的,类加载器所做的工作实质上是把类文件从硬盘读取到内存中 2.java中的类大致分为三种: 1、系统类 2、扩展类 3、程序员自定义的类 3.类加载的方式,两种 1、隐式装载,程序在运行过程中碰到new等方式生成对象时,隐式调用类加载器加载对应的类到JVM中 2,显示装载,通过class.forName()

yinyichao0107的专栏 658

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

[转]JVM加载class文件的原理机制?

JVM加载class文件的原理机制 JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。 由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需...

雨笋情缘的专栏 104

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

阅读目录 1、JVM简介 2、JVM的组成部分 3、JVM加载class文件的原理机制 在面试java工程师的时候,这道题经常被问到,故需特别注意。 1、JVM简介   JVM是我们Javaer的最基本功底了,刚开始学Java的时候,一般都是从“Hello World”开始的,然后会写个复杂点class,然后再找一些开源框架,比如S...

239

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JVM 加载 class 文件的原理机制

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

2301_77207909的博客 1200

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

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

sinat_33739100的博客 1203

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

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

weixin_45990682的博客 931

JVM加载class文件的原理机制简单总结

JVM加载class文件的原理机制

weisg81的专栏 1万+

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

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

weixin_45422672的博客 999

JVM 加载 Class 文件的原理机制

JVM(Java虚拟机)加载Class文件的过程分为三个步骤:加载、连接和初始化。下面是对这三个步骤的详细总结:加载: 加载是指将Class文件中的二进制数据读取到内存中,并将其转换为方法区中的运行时数据结构。通过类的全限定名查找并定位到类的二进制数据文件。将类的二进制数据文件读入到内存中。将类的二进制数据转化为方法区中的运行时数据结构,包括类的常量池、字段和方法信息、类的访问标志等。连接: 连接是将已经加载到内存中的类的二进制数据进行验证、准备和解析的过程。

Flying_Fish_roe的博客 858
上一篇: 【转】超级实用且不花哨js代码大全
下一篇: 【转】JS闭包深入详解
xlaaa111
博客等级 码龄19年 1粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值