贝壳三面:JDK1.8和1.9中类加载器有哪些不同?

文章内容收录到个人网站,方便阅读:http://hardyfish.top/

1. 类加载器简介

JVM 采用类加载器(ClassLoader) 来动态加载 .class 文件。从 JVM 角度来看,类加载器分为两类:

  1. 启动类加载器(Bootstrap ClassLoader) :用 C++ 实现,属于 JVM 本身的一部分。
  2. 其他 Java 实现的类加载器:继承自 java.lang.ClassLoader,用于加载应用程序类。

2. JDK 1.8 及之前的类加载器

JDK 1.8 及之前,Java 使用 3 种默认类加载器

启动类加载器(Bootstrap ClassLoader)

C++ 实现

加载

JAVA_HOME/lib

目录下的核心类库(如

rt.jar

扩展类加载器(Extension ClassLoader)

sun.misc.Launcher$ExtClassLoader

加载

JAVA_HOME/lib/ext

目录下的扩展类

应用类加载器(Application ClassLoader)

sun.misc.Launcher$AppClassLoader

加载

classpath

目录下的应用类

3. JDK 1.9 之后的类加载器变化

JDK 1.9 引入 Jigsaw 模块化系统(Project Jigsaw) ,对类加载器进行了调整:

扩展类加载器(Extension ClassLoader)

平台类加载器(Platform ClassLoader)

负责加载 JDK 模块化系统中的非核心模块

应用类加载器(Application ClassLoader)

应用类加载器(Application ClassLoader)

负责加载应用程序的

classpath

新的 Platform ClassLoader(平台类加载器)

  • JDK 1.9 之后,扩展类加载器被移除,改为 Platform ClassLoader。
  • Platform ClassLoader 作用:负责加载 JDK 平台 API 的非核心模块(如 java.sql)。不能直接访问 java.base 模块(由 Bootstrap ClassLoader 加载)。无法直接访问 classpath,但可以通过 ModuleLayer 访问。

4. JDK 1.8 vs JDK 1.9 类加载器结构

JDK 1.8 类加载器结构

Bootstrap ClassLoader
  ├── Extension ClassLoader
  │     ├── 加载 JAVA_HOME/lib/ext 目录
  ├── Application ClassLoader
        ├── 加载 classpath 目录
        ├── 自定义类加载器(User-defined ClassLoader)

JDK 1.9 类加载器结构

Bootstrap ClassLoader
  ├── Platform ClassLoader  (JDK 9+ 新增)
  │     ├── 加载 JDK 平台模块(如 java.sql)
  ├── Application ClassLoader
        ├── 加载 classpath 目录
        ├── 自定义类加载器(User-defined ClassLoader)

5. 类加载器的继承关系

类加载器并不是继承关系,而是组合关系,即父类加载器是一个 ClassLoader 类型的成员变量

public abstract class ClassLoader {
    private final ClassLoader parent;  // 组合关系
}

ClassLoader 内部,如果找不到类,会委派给 parent 继续查找

protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
    Class<?> c = findLoadedClass(name);
    if (c == null) {
        if (parent != null) {
            c = parent.loadClass(name, false);
        } else {
            c = findBootstrapClassOrNull(name);
        }
    }
    return c;


6. 关键变化总结

JDK 1.8 及之前

Bootstrap、Extension、Application

使用

Extension ClassLoader

加载

lib/ext

JDK 1.9 及之后

Bootstrap、

Platform

、Application

Extension ClassLoader

Platform ClassLoader

取代

7. 影响

  1. 模块化影响类加载 JDK 1.9 之后,类被封装在 module-info.java 中,非公开模块不能被直接访问。
  2. Platform ClassLoader 只能加载特定的 JDK 模块 不能直接加载 classpath 中的类。
  3. 自定义类加载器仍然适用 但需要在模块化环境下遵循新的访问规则。

8. 结论

  • JDK 1.9 之后,Platform ClassLoader 替代了 Extension ClassLoader
  • 类加载器仍然遵循双亲委派模型,但模块化影响了类加载机制
  • 自定义类加载器仍然适用,但需要遵循模块化规则
#面试题##面试#
大厂面试每日一题 文章被收录于专栏

大厂每日一道面试题!

全部评论

相关推荐

01-06 14:15
已编辑
大连理工大学 后端工程师
然后就是各大公司的了解,首先就是狗东,对就是他两次把我三面hr挂了,排序挂,而且它的流程比较慢,一般三面得半个月多,面试难度倒是比较简单,但就是因为简单所以排序很容易挂,因为它主要看学历和实习,我如果是研究生的话,肯定不会排序挂的唉,京东主要是从大三上学期9月份开始找大三的,然后一定一定一定一定准备一下京东的hr面,它是hrbp所以是有可能挂的,虽然大部分还是排序挂,但确实有这个可能,比如我第一次京东三面,它说你喜欢tob还是toc,结果我说了喜欢toc但实际上内部做的是tob😭,而且不准备的话会聊的很尴尬然后就是百度,百度给我的体验其实不太好,虽然有一次三面流程中的面试官都很好,但面的其它的流程差点气死我了,一定不要在上午11点面试,因为第一次,我面的是go,可能面试官也看不起java,全程左顾右盼,可能在听别人说话,可能着急吃饭了,一直追问某个问题,面了20分钟连算法也没有,第二次也是上午11点,上来先来两个算法题然后追着我项目最后两条介绍,我写了8条,追着大模型不放了,而且这次面试是我拿邮件催出来的,因为我问别的hr才知道这个hr把我简历锁了,可能本身不太想面我,不是这百度约好11点kpi面是吧,都着急吃饭,三面主管面的时候可能会问你对云服务的了解,我可能就是因为这个挂的,而且百度的话投那种刚出来的岗位,有的岗位我看从九月就挂上去了,天天回复10个以上一直挂到现在,它虽然有hc,就是不着急招人,非得等一个最好的候选人然后就是美团,我的白月光,给我的面试体验是最好的没有之一,但可能我跟美团缺点缘分吧,前两次一面都是在我没准备算法的时候面的都因为算法一面挂,后面就不怎么约面了,每次都在我没准备好的时候突然发个约面邀请,而且不知道为什么每次出的算法题都不是力扣hot100真绷不住了,面美团一定一定好好准备因为它的难度基本上是最低的然后就是小米,小米的面试官也挺好的不过我也就面过一次然后就是快手,也就第一次在官网投约面了后续简历筛不过,不过正常因为快手的面试难度基本除了字节鹅阿里,就是最难的和小红书差不多然后就是小红书,给我的体验最差的hr,没有之一,想了解的可以看一下我之前的帖子,面试难度很高,而且简历不容易过筛然后就是滴滴,滴滴hr给我的体验最好,约面快,挂的也快,难度和美团差不多简单,只不过我算法没写出来,一定一定一定一定一定一定把算法准备好然后就是虾皮,虽然hr效率很高,但是虾皮的hr好像不怎么跟业务商量,也就是说我一个java岗,hr可能把我推到需要深度学习的后端岗,有点绷不住,别听hr瞎给你推岗位,一定一定要看一下它推的岗位是啥,然后就是面试官,面试官挺好的,但你如果是java投虾皮的话那难度可能就有点高,可能和快手和小红书差不多最后一定一定一定一定一定一定一定一定一定一定一定不要用点评加外卖,多跟学长交流了解,什么时候企业招人,比如金九银十桐11,面试是最多的,别听别人说寒假实习好找那都是放屁,面试难度绝对比前几个月难最后hr面一定要说立即到岗实习6个月,哪怕口头oc了也有可能不下offer,一定要接着面,没下正式offer前当他们挂了在这找实习过程中,首先我犯了傲慢之罪认为凭着985本加点评加外卖找个大厂日常实习那不绰绰有余,结果失败了,我应该在9,10月份投中厂的给自己留条后路,中厂面试难度比大厂低多了,而且找面试一直找不到的话会拖慢你的提升,压力很大,没有反馈,拿中小厂当跳板会轻松很多,然后不要用点评加外卖,其次我犯了怠惰之罪,在面试不通过的时候我应该立即换一个项目而不是拿着原来的项目去面,抱有侥幸心理,第三我犯了没准备之罪在暑期我不应该好高骛远,应该好好准备八股加算法,而不是暑期第一个月先学了下微服务,然后学了下netty&nbsp;就给自己15天复习,三心二意,唉,一定一定起码给自己两个月复习时间,一个月10天拿来复习八股20天刷算法题,这样才能面过,如果我不三心二意的话说不准我8月27就通过美团的面试了,唉。当然我本来的计划就是这个寒假才找实习的而不是大三上学期去实习所以我才看起来这么三心二意,也是因为看牛客那么多人去找实习着急了,另一方面就是家庭原因,父亲突然被通知可能要被裁员了,唉,虽然最后是降职,但也是让我8月15号的时候着急了,开始乱投,不应该急的啊总而言之,我的找实习的过程是既失败又倒霉的,反正2025这后半年我们整个家庭都挺倒霉的,先是裁员通知,然后就是实习僧投在线简历唉,然后就是接连的三次三面挂还都是分开的浪费了我很多时间,每次一有三面我就懈怠了,不再面了,但每次三面都挂了真没谁了,最后以一个不太完美的中厂做完句号,当初9,10月份应该面中厂的,直接去中厂,给自己反馈唉,然后寒假找大厂,总而言之,这个最倒霉2025后半年总算过去了,希望明年2026能给自己一个满意的答卷,也是希望我的这份经历能给大家帮助最后,祝愿我们大家都能找到心满意足的实习,找到心仪的offer😄
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务