首页 > 其他分享 >面试官:什么是双亲委派模型?

面试官:什么是双亲委派模型?

时间:2023-03-08 15:13:38浏览次数:56  
标签:委派 面试官 Java ClassLoader 双亲 class 加载

本文已经收录进 JavaGuide(「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。)

参加过校招面试的同学,应该对这个问题不陌生。一般提问 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 包和类。

标签:委派,面试官,Java,ClassLoader,双亲,class,加载
From: https://www.cnblogs.com/javaguide/p/17192051.html

相关文章

  • 面试官要你介绍项目,怎么说?
    测试人员在找工作中,基本都会碰到让介绍项目的这种面试题,如何正确介绍自己的项目?需要做哪些技术准备?今天这篇文章,围绕这些问题,跟大家一起聊一聊。关于介绍自己的项目?可以......
  • JVM 类加载器、双亲委派原理
    类加载器ClassLoader作用:负责装入类。一个java程序运行,至少需要三个类加载器实例,负责加载不同类。BootstrapClassLoader是JVM内核内嵌加载器,主要负载加载JAVA_HOME/lib......
  • 面试官:来说说 https 和 http 区别?
    http和https的区别?一、传输信息安全性不同1、http协议:是超文本传输协议,信息是明文传输。如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的......
  • 面试官:从 MySQL 读取 100w 数据进行处理,应该怎么做?问倒一大遍!
    背景大数据量操作的场景大致如下:数据迁移数据导出批量处理数据在实际工作中当指定查询数据过大时,我们一般使用分页查询的方式一页一页的将数据放到内存处理。但有些......
  • 美团2面:如何保障 MySQL 和 Redis 数据一致性?这样答,让面试官爱到 死去活来
    文章持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+......
  • 面试官:怎么设计大文件、大数据场景下的传输加密方案?
    某年某月某一天,冷冽寒风中,姚小毛走进了某家公司,开始了新一轮的面试。一阵寒暄后。面试官:“你好,看你的项目经验中有做过数据加密的工作,你是使用什么加密算法加解密的?”......
  • kali之约束委派攻击
    用到的工具Powermad.ps1:https://github.com/Kevin-Robertson/PowermadRubeus.exe:https://github.com/r3motecontrol/Ghostpack-CompiledBinariesimpacket工具包:https:/......
  • 【技术分享】新人面试者如何忽悠一个不懂技术的面试官
    萌新面试者如何忽悠一个不懂技术的面试官由于公司业务需要,做了几天Android的面试官。作为一个完全没有做过Android项目的开发者,我无法问出具体的框架,技术细节。对于萌新......
  • 打破双亲委派机制
    再来一个沙箱安全机制示例,尝试打破双亲委派机制,用自定义类加载器加载我们自己实现的java.lang.String.classpublicclassMyClassload1extendsClassLoader{priv......
  • 为什么要设计双亲委派机制
    为什么要设计双亲委派机制?沙箱安全机制:自己写的java.lang.String.class类不会被加载,这样便可以防止核心API库被随意篡改避免类的重复加载:当父亲已经加载了该类时,就没有......