AppClassLoader与SystemClassLoader是一个东西吗?

简介: 首先为什么会有这么一个问题呢?主要还是因为网上充斥着各种JAVA ClassLoader的相关文章,什么:五分钟搞懂ClassLoader、深入浅出ClassLoader、一看就懂的ClassLoader等等。

问题来源


首先为什么会有这么一个问题呢?主要还是因为网上充斥着各种JAVA ClassLoader的相关文章,什么:五分钟搞懂ClassLoader、深入浅出ClassLoader、一看就懂的ClassLoader等等。


可是,当你看的文章多了,想必就会有如题般的疑惑:AppClassLoader与SystemClassloader是一个东西吗?为什么会有这个疑惑呢,我们看看这些图:


0.png


1.png


2.png

3.png


从上面的类加载器委派关系图中我们可以看到,BootstrapClassLoader 和ExtentClassLoader是大家都有的。可是到了第三层,不同的图显示的ClassLoader却是不一样的:有的是SystemClassLoader,而有的是AppClassLoader。


那么到底正确的应该是SystemClassLoader还是AppClassLoader呢?还是说这俩其实是一个东西?又或者说不同的JDK版本,这俩是不一样的?

02问题解析


Java虚拟机规范「1」中指出,Class Loader分为Bootstrap Class Loader以及User-defined Class Loader,其中Bootstrap Class Loader是由Java虚拟机使用C++实现的,没有对应的Java对象。


4.png


所谓User-defined Class Loader,其实也没有叫这个名称的Java对象,这里是一种泛称,直译过来为用户定义的Class Loader,对应JDK中的Java对象是java.lang.ClassLoader及其子类,除此之外,JDK中还提供了sun.misc.Launcher.ExtClassLoader以及sun.misc.Launcher.AppClassLoader。


那这是不是就意味着SystemClassLoader是错误的不存在的呢?当然也不是,在Jdk9中的ClassLoader的文档「2」中明确指出:


5`.png


同时有一篇大佬的博客「3」同样有提到:


5.png


所以,综上,其实AppClassLoader与SystemClassLoader是一个东西。


所以,看过这篇文章的小伙伴,以后应该就可以摆脱相关的疑惑了。其实,有些知识,我们在想要系统学习的时候,网上的知识内容很多,可是如果稍加细致的观察,我们便能看到许多的问题,而遇到问题后,你是囫囵吞枣,含糊而过,还是打破砂锅问到底也决定了我们之后对学过知识自信程度,这点很重要。


当然,如果你比较懒,还是可以多多关注强哥,提问题留言,大家一起讨论进步哈~    


相关文章
|
canal 存储 SQL
Canal 如何保证数据库库事务的一致性
Canal 如何保证数据库库事务的一致性
Canal 如何保证数据库库事务的一致性
|
运维 监控 NoSQL
Redis 分享-AOF的阻塞简单记录
公司分享讨论一些东西 拿出来大家分享讨论下
666 0
Redis 分享-AOF的阻塞简单记录
|
监控 Java API
Java Agent入门实战(三)-JVM Attach原理与使用
Java Agent入门实战(三)-JVM Attach原理与使用
|
12月前
|
NoSQL 前端开发 Java
Spring Boot 2.6.0 发布!一大波新特性,禁止了循环依赖,还有哪些更新?
Spring Boot 2.6.0 发布!一大波新特性,禁止了循环依赖,还有哪些更新?
|
算法 安全
常见的限流算法分析以及手写实现(计数器、漏斗、令牌桶)
限流是指在高并发、大流量请求的情况下,限制新的流量对系统的访问,从而保证系统服务的安全性。
1178 0
常见的限流算法分析以及手写实现(计数器、漏斗、令牌桶)
|
XML 缓存 Java
面试官:讲讲Spring框架Bean的加载过程
面试官:讲讲Spring框架Bean的加载过程
646 0
面试官:讲讲Spring框架Bean的加载过程
|
前端开发 Java 关系型数据库
【Java实战系列】认识一下线程上下文类加载器实现【逆向加载机制】|周末学习
【Java实战系列】认识一下线程上下文类加载器实现【逆向加载机制】|周末学习
228 0
|
Java 应用服务中间件 数据库
类加载器系列(三)——如何自定义类加载器
类加载器系列(三)——如何自定义类加载器
1049 0
类加载器系列(三)——如何自定义类加载器
|
Java API 开发者
Zuul 网关与 Gateway 之间的区别 | 学习笔记
快速学习 Zuul 网关与 Gateway 之间的区别
564 0
|
存储 Java 容器
基于Spring Boot的Environment源码理解实现分散配置详解
基于Spring Boot的Environment源码理解实现分散配置详解
基于Spring Boot的Environment源码理解实现分散配置详解