服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

携程一面:什么是双亲委派模型?

日期: 来源:脚本之家收集编辑:Guide
将 脚本之家 设为“星标
第一时间收到文章更新

来源 | JavaGuide

如若转载请联系原公众号

这是携程一面的一个 JVM 面试真题。参加过校招面试的同学,应该对这个问题不陌生。一般提问 JVM 知识点的时候,就会顺带问你双亲委派模型(别扭的翻译。。。)。

就算是不准备面试,学习双亲委派模型对于我们也非常有帮助。我们比较熟悉的 Tomcat 服务器为了实现 Web 应用的隔离,就自定义了类加载并打破了双亲委派模型。

这篇文章我会先介绍类加载器,再介绍双亲委派模型,这样有助于我们更好地理解。

目录概览:

回顾一下类加载过程

开始介绍类加载器和双亲委派模型之前,简单回顾一下类加载过程。

  • 类加载过程:加载->连接->初始化
  • 连接过程又可分为三步:验证->准备->解析
类加载过程

加载是类加载过程的第一步,主要完成下面 3 件事情:

  1. 通过全类名获取定义此类的二进制字节流
  2. 将字节流所代表的静态存储结构转换为方法区的运行时数据结构
  3. 在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口

类加载器

类加载器介绍

类加载器从 JDK 1.0 就出现了,最初只是为了满足 Java Applet(已经被淘汰) 的需要。后来,慢慢成为 Java 程序中的一个重要组成部分,赋予了 Java 类可以被动态加载到 JVM 中并执行的能力。

根据官方 API 文档的介绍:

A class loader is an object that is responsible for loading classes. The class ClassLoader is an abstract class. Given the binary name of a class, a class loader should attempt to locate or generate data that constitutes a definition for the class. A typical strategy is to transform the name into a file name and then read a "class file" of that name from a file system.

Every Class object contains a reference to the ClassLoader that defined it.

Class objects for array classes are not created by class loaders, but are created automatically as required by the Java runtime. The class loader for an array class, as returned by Class.getClassLoader() is the same as the class loader for its element type; if the element type is a primitive type, then the array class has no class loader.

翻译过来大概的意思是:

类加载器是一个负责加载类的对象。ClassLoader 是一个抽象类。给定类的二进制名称,类加载器应尝试定位或生成构成类定义的数据。典型的策略是将名称转换为文件名,然后从文件系统中读取该名称的“类文件”。

每个 Java 类都有一个引用指向加载它的 ClassLoader。不过,数组类不是通过 ClassLoader 创建的,而是通过 JVM 在需要的时候自动创建的,数组类通过getClassLoader()方法获取 ClassLoader 的时候和该数组的元素类型的 ClassLoader 是一致的。

从上面的介绍可以看出:

  • 类加载器是一个负责加载类的对象,用于实现类加载过程中的加载这一步。
  • 每个 Java 类都有一个引用指向加载它的 ClassLoader
  • 数组类不是通过 ClassLoader 创建的(数组类没有对应的二进制字节流),是由 JVM 直接生成的。
class Class<T> {
  ...
  private final ClassLoader classLoader;
  @CallerSensitive
  public ClassLoader getClassLoader() {
     //...
  }
  ...
}

简单来说,类加载器的主要作用就是加载 Java 类的字节码( .class 文件)到 JVM 中(在内存中生成一个代表该类的 Class 对象)。 字节码可以是 Java 源程序(.java文件)经过 javac 编译得来,也可以是通过工具动态生成或者通过网络下载得来。

其实除了加载类之外,类加载器还可以加载 Java 应用所需的资源如文本、图像、配置文件、视频等等文件资源。本文只讨论其核心功能:加载类。

类加载器加载规则

JVM 启动的时候,并不会一次性加载所有的类,而是根据需要去动态加载。也就是说,大部分类在具体用到的时候才会去加载,这样对内存更加友好。

对于已经加载的类会被放在 ClassLoader 中。在类加载的时候,系统会首先判断当前类是否被加载过。已经被加载的类会直接返回,否则才会尝试加载。也就是说,对于一个类加载器来说,相同二进制名称的类只会被加载一次。

public abstract class ClassLoader {
  ...
  private final ClassLoader parent;
  // 由这个类加载器加载的类。
  private final Vector<Class<?>> classes = new Vector<>();
  // 由VM调用,用此类加载器记录每个已加载类。
  void addClass(Class<?> c) {
        classes.addElement(c);
   }
  ...
}

类加载器总结

JVM 中内置了三个重要的 ClassLoader

  1. BootstrapClassLoader(启动类加载器) :最顶层的加载类,由 C++实现,通常表示为 null,并且没有父级,主要用来加载 JDK 内部的核心类库( %JAVA_HOME%/lib目录下的 rt.jarresources.jarcharsets.jar等 jar 包和类)以及被 -Xbootclasspath参数指定的路径下的所有类。
  2. ExtensionClassLoader(扩展类加载器) :主要负责加载 %JRE_HOME%/lib/ext 目录下的 jar 包和类以及被 java.ext.dirs 系统变量所指定的路径下的所有类。
  3. AppClassLoader(应用程序类加载器) :面向我们用户的加载器,负责加载当前应用 classpath 下的所有 jar 包和类。

相关阅读

  • 又出现BUG,Win11新版本升级需谨慎

  • 关注“脚本之家”,与百万开发者在一起出品 | 电脑报(ID:CQCPCW)已获得原公众号的授权转载微软近日为 Windows 11推送了 KB5022913 更新,此次更新最大的重点在于任务栏体验升级和
  • 荣耀晋州 | 市教育局榜上有名

  • 近日,第29届全国青少年爱国主义读书教育活动获奖结果揭晓,石家庄市教育系统组织广大青少年踊跃参与,在小学生故事会、中学生演讲会、春苗网知识问答和征文比赛等四项主题活动中
  • 我市开展“三八妇女节”送温暖活动

  • 3月3日,在“三八妇女节”来临之际,副市长冀涛带领市红十字会、市妇联负责同志先后到东里庄镇马坊村吴秀轻、马于镇北辛庄村周永新、马于镇后彭头村王兰乔家中走访慰问,为她们送
  • 雷锋小学举行鲜花送雷锋活动

  • 今年是毛泽东主席“向雷锋同志学习”题词发表60周年,为弘扬雷锋精神,3月3日,我市雷锋小学举行“鲜花送雷锋”活动。 活动在全体师生一起唱响歌曲《学习雷锋好榜样》中拉开帷幕,
  • 贴心为民 | 气温将要冲刺20℃啦!

  • 2023/3/2 星期四本周晴朗、升温是主旋律未来两天时间在暖空气支持下气温还将一路看“涨”预计明后两天的最高温度会升高到19~20℃左右春天的气息越来越浓具体天气预报晋州气
  • 贴心为民 | 一波“升温”浪潮席卷而来

  • 今日阳光助力带来诚意满满的温暖最高气温20℃左右“初春”的既视感满满未来两天我们将继续与春天约会不仅阳光管够,气温更懂“温柔”升温的小火箭一路上扬具体天气预报晋州气
  • 南方科技大学,Nature!

  • 本文来源 | iNature沿海海域浮游植物大量繁殖有利于沿海渔业生产和生态系统功能,但也会导致重大的环境问题,目前还没有全球范围内关于浮游植物大量繁殖的详细描述。2023年3月1
  • 驻豫全国人大代表赴京参会

  • 本报记者 李点 董亮 杜小伟 蔡迅翔肩负神圣职责和全省人民的期待与重托,3月3日一早,我省出席十四届全国人大一次会议的代表启程赴京参会。  今年是新一届全国人大代表履职的

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 虚拟电厂赋能绿色发展 数字科技实现聚沙成塔

  • 双碳政策下的新星:虚拟电厂为助力实现国家提出的碳达峰、碳中和目标,作为碳排放的重点领域,能源行业诸多创新技术频频出现在大众视野中,这其中“虚拟电厂”的概念也逐渐成为热门
  • ChatGPT能取代多少程序员?

  • 将 脚本之家 设为“星标⭐”第一时间收到文章更新深燃(shenrancaijing)原创作者 | 邹帅编辑 | 唐亚华“去年年底,我看到大佬们都在分享ChatGPT相关的内容,一开始我以为还是资本
  • 携程一面:什么是双亲委派模型?

  • 将 脚本之家 设为“星标⭐”第一时间收到文章更新来源 | JavaGuide如若转载请联系原公众号这是携程一面的一个 JVM 面试真题。参加过校招面试的同学,应该对这个问题不陌生。