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是一个东西。


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


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


相关文章
|
Java API Spring
史上最全AOP 切面表达式,看完逼格有提升了
史上最全AOP 切面表达式,看完逼格有提升了。源码已放开头了,请你查收。
990 0
|
Java Spring
Spring AOP切点表达式(Pointcut)详解
Spring 的 AOP 中的一个核心概念是切点(Pointcut),切点表达式定义通知(Advice)执行的范围。
3785 0
|
存储 Oracle 安全
JDK 11 是发布了,但收费吗?
自 9 月 26 日,Oracle JDK 11 正式版本发布以来,一直被大家所看好,因为它是继 6、7、8之后,第一个长期支持的版本「见下图」,而 9 、10 估计多半会夭折了。。。
5733 0
JDK 11 是发布了,但收费吗?
|
监控 Java API
Java Agent入门实战(三)-JVM Attach原理与使用
Java Agent入门实战(三)-JVM Attach原理与使用
|
监控 算法 Java
JVM 调优之 glibc 引发的内存泄露
Pmap 提供了进程的内存映射,pmap 命令用于显示一个或多个进程的内存状态。其报告进程的地址空间和内存状态信息
JVM 调优之 glibc 引发的内存泄露
|
存储 算法 关系型数据库
一文带你了解MySQL之InnoDB 数据页结构
学完了记录结构,我们该学数据页的结构,前边我们简单的提了一下页的概念,它是Innodb管理存储空间的基本单位,页的大小默认16KB,InnoDB为了不同的目的而设计了许多种不同类型的页,比如存放表空间头部信息的页,存放Insert Buffer信息的页,存放INODE信息的页,存放undo日志信息的页等等等等。而我们聚焦的是那些存放我们表中记录的那种类型的页,官方称这种存放记录的页为索引(INDEX)页,鉴于我们还没有了解过索引是个什么东系,而这些表中的记录就是我们日常口中所称的数据,所以目前还是叫这种存放记录的页为数据页吧
506 0
|
前端开发 Java 关系型数据库
【Java实战系列】认识一下线程上下文类加载器实现【逆向加载机制】|周末学习
【Java实战系列】认识一下线程上下文类加载器实现【逆向加载机制】|周末学习
252 0
|
Java 程序员 API
IDEA插件开发(一)
IDEA插件开发
2595 0
|
存储 JSON 前端开发
massCode 一款优秀的开源代码片段管理器
本文将介绍一款适合程序员使用的个人代码片段管理工具 massCode
1603 0
massCode 一款优秀的开源代码片段管理器
|
算法 关系型数据库 MySQL
索引合并机制详解
索引合并机制详解
700 0
索引合并机制详解