07|类加载子系统(下):如何打造一个属于你的类加载器?
康杨
你好,我是康杨。
上节课我们学习了 JVM 中的类加载流程和机制,接下来我们一起来执行这个流程的类加载器。在这个过程中,你将了解到 JVM 中的类加载器家族及其在最新的 JVM 版本中的演进。最后我还会带你打造一个专属于你自己的自定义类加载器,它可以帮助你更好地管理和使用 Java 应用程序,提高可靠性和安全性,并满足我们的特定需求。
类加载器家族
JVM 中的类加载器家族有 5 个成员,下面我们就来一个个看。
启动类加载器(Bootstrap ClassLoader)
这是所有类加载器中唯一一个用 C++ 代码实现的,没有对应的类,也是 JVM 实现的一部分,主要负责加载 Java 核心库。
扩展类加载器(Extension ClassLoader)
扩展类加载器负责加载的目录是 jre/lib/ext,这个目录下的具体文件和类库实际上会因 Java 版本和平台的不同而不同。例如,在 Windows 系统的 Oracle JDK 8 中,通常你可以找到 access-bridge-64.jar、cldrdata.jar 等文件。
这些文件里主要是 Java 的扩展类库,包括各种 IO、网络协议、加密、字符集支持等等。然而在部分 Linux 发布版和 Docker 环境中,你可能发现 ext 目录是空的。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
JVM类加载器家族及其演进 本文深入介绍了JVM中的类加载器家族,包括启动类加载器、扩展类加载器和应用类加载器,并详细讲解了如何打造一个自定义类加载器以满足特定需求。另外,文章还介绍了双亲委派模型的核心流程和应用场景,以及该模型的限制和Tomcat是如何突破这些限制的。通过本文,读者可以快速了解JVM中类加载器的工作原理和自定义类加载器的实现方式,以及双亲委派模型的作用和局限性。 在JDK的演进过程中,类加载器也发生了变化。从JDK 9开始,JVM引入了新的模块系统JPMS,拆分了原本的引导类加载器为平台类加载器和系统类加载器。而到了JDK 11,为了提高性能,JVM使用类数据共享(CDS)技术,允许不同的Java进程共享相同的JVM类元数据。到JDK 17,JVM直接移除了系统类加载器,所有的类加载操作由原本的应用类加载器接管,简化了JVM架构,减小潜在的安全风险。 总之,本文全面介绍了JVM类加载器家族的工作原理、自定义类加载器的实现方式以及双亲委派模型的作用和局限性。同时,还对JDK版本中类加载器的演进进行了详细的阐述,使读者对JVM类加载器的发展历程有了更清晰的认识。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云时代的 JVM 原理与实战》,新⼈⾸单¥59
《云时代的 JVM 原理与实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(7)
- 最新
- 精选
- C.到 JDK 17 的时候,JVM 则是直接移除了系统类加载器,所有的类加载操作由原本的应用类加载器接管。这个改动简化了 JVM 架构,也减小潜在的安全风险。 这个潜在风险是什么?
作者回复: 比如,对于 Java 的模块化有更好的支持,系统类加载器在加载模块时可能存在映射关系混乱的情况,移除系统类加载器使得在模块间的加载关系上有更直接的管理,提高了模块化系统的安全性。提高了运行时性能,因为系统类加载器通常需要搜索本地文件系统上的多个路径,而应用类加载器可以从 JVM 类路径中更直接地寻找和加载类。
2023-09-19归属地:江苏1 - 记得晚睡感觉很多名词都不懂是什么意思 很难理解
作者回复: 比如那些名词呢,其实可以先有逻辑上整体的认知,然后逐个攻克
2023-09-26归属地:北京 - 王盛武这样不同 Web 模块的类可以相互访问 准确说是web模块能访问common lib目录的类。 web模块的类并不能相互访问2023-10-24归属地:北京1
- Geek_320730示例文件直接运行,通过getClassLoader获取类的classLoader,获取的是AppClassLoader,并没有走定义的类加载器,此时debug也不会进入断点。然后删除编译后的SampleClass文件,使AppClassLoader不能正常加载类,再进行debug,就会进入断点,说明先在父类加载器AppClassLoader中加载,失败后,在使用当前自定义加载器。 提供另一个实例:https://github.com/kuifir/practice/blob/master/jvm-module/src/main/java/com/kuifir/classloader/CompileClassLoader.java 此实例可以加载没有class文件的目标类,当class文件存在的时候,ClassLoader为AppClassLoader,当class文件不存在时,ClassLoader为自定义类加载器。2023-10-10归属地:北京
- 浩仔是程序员老师,普通的应用中有什么场景可以用到自定义类加载器吗?如果我想要覆盖第三方库的某一个类,可以怎么做呢2023-09-26归属地:广东1
- peter请教老师几个问题: Q1:jre\lib下面哪一个是启动类加载器?此目录下面并没有Bootstrap ClassLoader一类的文件。jre\lib\ext下面哪个是扩展类加载器?此目录下面并没有ExtClassLoader一类的文件。 Q2:我的笔记本电脑上没有定义CLASSPATH环境变量,这说明没有应用类加载器吗? Q3:Java核心库主要包含哪些功能? Q4:Idea中的CLASSPATH在哪里可以找到? Q5:自定义类加载器实现以后,需要做什么操作才能被JVM使用? Q6:本课中的自定义类加载器例子,委托父类实现吗?好像没有看到哪部分代码是用来委托父类实现的。 Q7:Tomcat每个WEB模块有自己的类加载器,这些模块的类加载器都有一个共同的父加载器,对吗? 此外,在这种模式下,还有启动类加载器、扩展类加载器吗? Q8:“引导类加载器”是指启动类加载器吗? Q9:平台类加载器和系统类加载器的区别是什么?2023-09-05归属地:河南
- sc请问老师,在 类加载器的演进 小节中讲到,jdk9 『原本的引导类加载器也被拆分成了两个不同的加载器,分别是平台类加载器(Platform ClassLoader)和系统类加载器(System ClassLoader)。』是指在 jdk9 中的 Bootstrap ClassLoader 被拆分为两部分了吗,那 Bootstrap ClassLoader 还存在吗,这里说的拆飞之后的系统类加载器和之前说的的应用类加载器不是一种加载器吗,之后说 jdk17 又取消了系统类加载,那在 jdk17 中,还是引导类加载器-平台类加载器-应用类加载器-自定义类加载器 这样吗2023-09-04归属地:浙江
收起评论