JVM篇(七)--类加载器

jvm类加载器 类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术。它会通过二进制流的方式获取到字节码文件的内容,然后将获取到的数据交给Java虚拟机。虚拟机会在方法区和堆上生成对应的对象保存字节码信息。 阅读详情

1.类加载器介绍

启动类加载器:是系统最底层的加载器,负责加载java的工具类,加载Jre/lib/rt.jar

扩展类加载器:这个一般不常用加载Jre/lib/ext/*jar这个目录下的所有数据

应用程序类加载器:主要加载Class_path指定目录所有jar,我们写的程序啊,第三方jar包spring,hebernate等都由此加载。

自定义加载器:有一些不在CLASS_PATH中,也不在Jre目录下,或者是网络流加载类,可以写自定义去加载。

前三个都是jvm自带的,后一个是我们自己开发。

下面依次讲讲这三个类都是干嘛的?

1.1启动类加载器

1.启动类加载器使用C语言开发

2.用于加载Java核心类库

   JAVA_HOME/jre/lib/rt.jar、resources.jar ...运行时核心库。

   {sun.boot.class.path}路径下的jar。

3.基于沙箱机制,只加载java、javax、sun包开头的类。

启动类加载器都是会加载固定的名称的类,也可以自定义sun.boot.calss.path路径的的jar,当然这种方式用的少,启动类加载器只加载java、javax、sun的包,因为出于安全考虑,如果电脑被黑客入侵以后往路径随便放个危险的文件被加载后会出现很大问题,出于这种考虑只拿这种做开头的类

1.2扩展类加载器

1.java语言编写,由sun.misc.Launcher$ExtClassLoader实现

2.上级加载器为启动类加载器

3.加载 JAVA_HOME/jre/ext扩展目录下的类库

  如果你开发的jar放入该目录也会被扩展类加载器加载

1.3应用程序(系统)类加载器

1.java语言编写,由sun.misc.Launcher$AppClassLoader实现

2.应用程序加载器是默认的加载器,绝大多数类都由它加载

3.上级加载器为扩展类加载器

4.它负责加载CLASSPATH下的应用(三方)类库

示例:看看不同的类加载器

下面的SunEC我也不知道是什么类干什么的但是扩展类里有它就拿它做个测试

运行下:

我们自定义类ClassLoaderSample由应用程序类加载器加载

不同的类加载器操控自己不同的区域

2.自定义加载器

为什么会有自定义加载器?

 在某些特殊场合下会用自定义加载器,自定义加载器的场景

 1.字节码二进制流来自于网络

 2.字节码文件不在指定的lib/ext/classpath路径下

 3.需要对二进制流进行加工后才能得到字节码

字节码不是一个文件,需要网络传输调用就能用到自定义类加载,字节码文件不在扩展类的路径下需要自定义类加载,需要对流加工,比如加密,还原解密需要后才能得到字节码。

面试题:Class实例在JVM中是全局唯一么?

答:我们都知道加载类之前会有类是否被加载过的判断,所以是全局唯一的,但是这道题有前提,就是是在同一个加载器里是全局唯一的,不同的加载器产生的实例就是不同的就不是全局唯一了。

我们演示下示例更加了解自定义类加载器,也能知道jvm全局唯一不?

创建了两个自定义加载器:MyClassLoader1,MyClassLoder2

再创建一个ClassSample字节码,复制一个放到C盘,不属于启动类加载器,不属于扩展类加载器

打开MyClassLoader类,看看自定义加载器怎么实现?

1.首先:继承ClassLoader,重写findClass()

2.获取字节码二进制流

3.defineClass加载生成Class实例

打开MyClassLoader2,其实是和MyClassLoader1完全相同的,只不过是加载路径是D盘,演示一下上面的面试题,针对两个类不同名字的加载器,但是加载相同的字节码文件会有什么结果呢?

咱们打开测试类,通过new对两个类加载器进行实例化c1、c2,调用loadClass(“ClassSample”)后就会找到对应实例的findClass()

运行后发现两个类加载器完全不同,一个用MyClassLoader1,一个是MyClassLoader2,它们的hashCode也不同,代表不是一个实例,由此得出以下结论。

 1.3 双亲委派模型

双亲委派就是:假如我自己自定义了一个类需要加载,此时通知系统类加载器,但是系统类加载器并不会加载因为它有上级,然后扩展类还有上级就是引导类加载器,相当于一直委派到引导类加载器,然后下一阶段就是依次加载了,引导类加载器加载的是java基本类库,所以加载不了我们自定义的类,再像下找就是扩展类加载器,扩展类是加载扩展类下的包,也加载不了自定义的,再向下找加载,找到了系统类加载器,是可以加载到我们自定义的类的。

那咱们现在加载一个java提供的Object类的话双亲委派是怎么工作的呢,首先还是系统类加载器开始,然后委派扩展类,再委派启动类加载器,然后启动类加载器加载发现是它加载的范畴进行加载,后续的扩展类和系统类加载器不再进行加载工作。

面试题:自定义类java.lang.Custom运行时会有什么问题?

会报错,不可以定义java.lang开头,这个是启动类加载器的范畴使用,但是却是自定义类,所以为了安全会报错。

示例:

 

java应用程序类加载器,ClassLoader for java Application java应用程序类加载器(ClassLoader for java Application),类似exe4j, 方便启动java程序, 配置灵活,支持多平台选择性配置 立即下载

相关推荐

避开这些坑!智鼎MAP性格测试高分指南(附互联网/国企/外企答题模板)

本文深入解析智鼎MAP职业性格测试的核心逻辑与常见陷阱,提供针对互联网、国企、外企三大行业的差异化答题策略与实战模板。帮助求职者理解测试本质,避开追求完美人设、忽视程度副词等心理陷阱,塑造与目标岗位高度匹配的职业画像,从而在招聘关键环节脱颖而出。

rainy的博客 997

类的加载器种类

启动类加载器(核心类库都是由启动类加载器加载) 扩展类加载器(加载jre/lib/ext文件夹下的类) 应用程序类加载器(我们写的基本都是由它加载) 自定义类加载器

weixin_57929476的博客 135

别再只跑memtester了!嵌入式Linux内存压力测试,这5个参数和场景你试过吗?

本文深入探讨了嵌入式Linux内存压力测试的高级技巧,重点解析了memtester工具的5个关键参数和实战场景。通过物理地址测试、迭代控制、内存分配策略等调优方法,帮助开发者有效检测内存稳定性问题,适用于长期运行设备、特定故障重现等复杂场景,提升嵌入式系统可靠性。

weixin_30838873的博客 425

【Java 基础篇】Java类加载器详解

Java允许开发人员自定义类加载器,以满足特定的加载需求。自定义类加载器必须继承类,并重写findClass方法。在findClass方法中,开发人员可以根据自己的规则和逻辑来加载类的字节码。// 根据名称加载类的字节码 byte [ ] byteCode = loadClassByteCode(name);// 调用defineClass方法将字节码转换为Class对象 return defineClass(name , byteCode , 0 , byteCode . length);

繁依Fanyi的博客 1万+

TMS320C6678开发笔记1-6---C6678单核烧写程序

第6节 单核烧写加载程序 6.1节 TI参考文档 参考文档:《KeystoneI Bootloader Resources and FAQ》讲的非常好,建议一定要看 https://processors.wiki.ti.com/index.php/KeystoneI_Bootloader_Resources_and_FAQ#Direct_Boot_Examples_.28without_IBL.29 里面有三个工程: C6678 EVM SPI boot example C6657 EVM ..

kunkliu的博客 5697

海康工业相机排雷笔记02-像素格式解析

工业相机使用过程记录 02-像素格式解析 通过将相机输出图像裸数据raw格式直接存图查看 一、黑白/Mono 直接使用相机测试图像存图: 图像中各部分灰度分别为:0、36、73、109、146、182、219、255,以灰度73列为例 (1)Mono 8 该列图像数据为十六进制49,十进制为73,那么Mono 8就是每个像素点占8bit,依次排列。 (2)Mono 10 该列图像数据为十六进制2401,由于相机均为小端数据,实际数据应解析为0124,十进制为292=73*4,那么Mono 10格式为每

yonghuming_66的博客 8360

2.类加载器

类加载器详解

weixin_42179515的博客 425

RV1126 ISP调参实战:3A算法参数调节的7个技巧

││ │ DEMOSAIC (去马赛克) │ ││ │ GAMMA (Gamma 校正) │ ││ │ DPC (坏点校正) │ ││。

小灰灰的博客 665

java中的类加载器

java中一般来说有三种类加载器,分别为: 引导加载器,扩展加载器,应用加载器,还有一个线程上下文类加载器类加载器可以动态将一些类加载的虚拟机中,与sping中的ioc类似;spring中就是利用线程上下文类加载器,不停的判断是否需要加载某些类,卸载,装载这些类,从而实现了热插拔,其实就是spi机制;spring中的 spring.factories 或者是 spring-configuration-metadata.json 同样也是spi的一种实现,与原始java中的spi异曲同工;

学海无涯,我用JAVA 2277

嵌入式Linux&Android开发-TP调试

目录 一、修改DTS,添加新的I2C设备 二、修改Makefile,Kconfig 三、tp调试时的问题排查 一、修改DTS,添加新的I2C设备 &i2c4 { status = "okay"; clock-frequency = <400000>; gslX680@40 { compatible = "gslX680"; reg = <0x40>; touch-gpio = <&gp

嵌入式成长手册 572

SAP ABAP 缓冲同步揭秘——从 DDLOG 表到 RSDBBUF3 的完整实践指南

DDLOG 看似一张不起眼的系统表,却承担着 SAP 多实例环境下的数据一致性重任。通过掌握其字段意义、解析方法及周边监控工具,你可以在性能与一致性之间找到最佳平衡;通过精细化的参数管理与主动刷新策略,更能在关键业务场景中确保“数据永远是最新的”。愿本文能成为你日常排障与架构决策的参考手册。

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

【JVM】类加载器

类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术。一个Tomcat程序中可以运行多个Web应用,如果这两个应用中出现了相同限定名的类,比如Servlet类,Tomcat要保证这两个类都能加载并且它们应该是不同的类。如果不打破双亲委派机制,当应用类加载器加载Web应用1中的MyServlet之后,Web应用2中相同限定名的MyServlet类就无法被加载了。Tomcat使用了自定义类加载器来实现应用之间类的隔离。

Decade_Faiz的博客 999

KMD 核心功能模块——命令提交与调度:Ring Buffer 与硬件引擎交互

《KMD 中的中断与同步机制——从 Fence 到 Timeline Semaphore 的深度解析》GPU 需要持续接收命令,但硬件执行是流式处理。Ring Buffer 作为。导致 CVE-2022-1234(GPU 挂起),修复后强制检查。:命令提交延迟从 50μs 降至 5μs(20 倍提升)。,CPU 通过写入该地址更新指针(避免直接操作寄存器)。,实现 CPU 与 GPU 的高效协同。),GPU 读指针更新是硬件自动完成的。(通过硬件状态机),实现真正的零等待。AMDGPU 驱动曾因。

amy_mhd的博客 83

深入OpenJDK源码全面理解Java类加载器(上 -- JVM源码篇)

目录前言一、从JDK源码看双亲委派二、使用步骤1.引入库2.读入数据总结 前言 关于JVM类加载的基础理论知识,请参照《深入理解Java虚拟机》读书笔记(六)–虚拟机类加载机制(上)和《深入理解Java虚拟机》读书笔记(六)–虚拟机类加载机制(下)。 一、从JDK源码看双亲委派 注:博主是使用的是openjdk8,换了新电脑还没有去编译源码,所以看的是静态代码,关于如何编译和调试源码,网上不少文章都有介绍,这里就不赘述了 我们都知道在Java类加载中,除了BootStrap加载器,App和Ext加载

黄智霖的博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

JVM类加载器

文章目录一、类加载器二、类与类加载器三、双亲委派模型四、破坏双亲委派模型4.1、Tomcat4.1.1、WebApp类加载器4.1.2、Shared类加载器4.1.3、Catalina类加载器4.1.4、Common类加载器4.1.5、Jsp类加载器4.2、JDBC 一、类加载器 从Java虚拟机的角度来讲,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现,是虚拟机自身的一部分;另一种就是所有其他的类加载器,这些类加载器都由Java语

rockvine的博客 3486

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

JVM类加载器详解

前言 在上一篇中,通过下面这幅图大致了JVM整体的内部运行结构图,在JVM的结构中,类加载子系统作为连接外部class文件与真正将class文件加载到运行时数据区,承担着重要的作用 类加载器是什么?有什么作用? 1、负责从文件或者网络加载class文件字节流 2、读取字节码中的信息,并在运行时存储到JVM的内存区域 3、检查并确保加载的class文件信息符合JVM字节码规范 ...

congge 6356

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JVM-基础篇-10-类加载器的分类

引导类加载器:负责加载 Java 核心类库。扩展类加载器:负责加载 JDK 扩展目录下的类。系统类加载器:负责加载应用程序类路径下的类。自定义类加载器:由用户自定义,用于加载特定需求的类。通过这些类加载器,Java 实现了灵活的类加载机制,同时也确保了类加载的安全性与效率。模块化和分层设计:确保每个层次只负责加载特定类型的类。父委托机制:保证加载过程的安全性,防止核心类库被恶意替换。灵活性和隔离性:支持动态加载和模块隔离,适应复杂应用场景。性能优化:提高类加载效率,避免不必要的全局加载。

qq_41577703的博客 865

JVM——类加载器

讲解了JVM三种类加载器,即启动类加载器、扩展类加载器和应用程序类加载器,同时讲解了类加载器的源码,以及用户根据自己需求自定义类加载器,此外还介绍了它们之间的包含关系以及类加载器所采用的双亲委派机制。

码说芯语的博客 1562

面试八股之JVM篇2——类加载器

类加载器的种类、作用、双亲委派模型及采用原因、类装载全过程七大步

做一个善良的人,做好自己的事,如果愿意,再发一份光。 997

【JVM】深入理解 JVM 类加载器

除启动类加载器外,所有类加载器都有一个父加载器;当需要加载一个类时,当前类加载器会先将请求委派给父加载器,只有父加载器无法加载时,才尝试自己加载。这里的 “双亲” 并非指两个父加载器,而是层级委派关系(更准确地说应称为 “单亲委派”)。类加载器之间的父子关系通过组合而非继承实现(类通过parent字段持有父加载器引用)。JVM 允许开发者通过继承类实现自定义类加载器,以满足特殊需求(如加密字节码、从网络加载类等)。// 类加载路径@Overridetry {// 1. 读取字节码文件。

m0_61057201的博客 924

JVM的类加载器

JVM只会运行二进制文件,类加载器的作用就是将字节码文件加载到JVM中,从而Java程序能够启动起来。加载某一个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则会继续向上委托如果该类委托上级没有被加载,子加载器尝试加载该类加载:查找和导入class文件验证:保证加载类的准确性准备:为类变量分配内存并设置类变量初始值解析:把类中的符号引用转换为直接引用初始化:对类的静态变量,静态代码块执行初始化操作使用:JVM 开始从入口方法开始执行用户的程序代码。

2301_81453175的博客 1641

黑马Java面试笔记之 JVM虚拟机篇(JVM+类加载器)

程序计数器:线程私有的,内部保存的字节码的行号。用于记录正在执行的字节码指令的地址。javap -verbose xx.class 打印堆栈大小,局部变量的数量和方法的参数idea图形化java虚拟机对于多线程是通过线程轮流切换并且分配线程执行时间。在任何的一个时间点上,一个处理器只会处理执行一个线程,如果当前被执行的这个线程它所分配的执行时间用完了【挂起】。处理器会切换到另外的一个线程上来进行执行。并且这个线程的执行时间用完了,接着处理器就会又来执行被挂起的这个线程。

2201_75550069的博客 1348

【JVM篇】什么是类加载器,有哪些常见的类加载器

负责在类加载过程中,将字节码信息以流的方式获取并加载到内存当中。

小吉妙妙屋 1550

聊一聊JVM的类加载器机制

聊一聊JVM的类加载器机制 目录 聊一聊JVM的类加载器机制 01 怎么获取类加载器?哪几种类加载器 02 各个加载器加载的路径? 01 怎么获取类加载器?哪几种类加载器 BootStrapClassLoader 引导类加载器 ExtClassLoader 扩展类加载器 AppClassLoader应用级别的类加载器 UserD...

DeanKano的博客 51万+
上一篇: JVM篇(六)--类加载过程
下一篇: Redis高可用与Sentinel灾备切换案例
PromisingGirl-Du
博客等级 码龄9年 1143粉丝 225原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值