面试题类加载器

4次阅读

共计 979 个字符,预计需要花费 3 分钟才能阅读完成。

面试题:类加载器

1. Java 类加载器

  • Java 源代码.java 文件通过编译成字节码.class 文件后,需要被加载到 Java 虚拟机的内存空间中使用,这个过程就是类加载。类加载依靠的是 Java 类加载器
  • Java 类加载器是 Java 运行时环境的一部分,负责动态加载 Java 类到 Java 虚拟机的内存空间中。类通常是按需加载的,即第一次使用该类时才加载。由于有了类加载器,Java 运行时系统不需要知道文件的位置与文件系统。

2. JVM 的 3 个默认类加载器

  1. 引导(Bootstrap)类加载器。由原生代码 C 语言编写,不继承 java.lang.ClassLoader。负责加载核心 Java 库,存储在 <JAVA_HOME>/jre/lib 目录中。
  2. 扩展(Extensions)类加载器。用来在指明的目录中加载 Java 的扩展类。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。该类由 sun.misc.Launcher$ExtClassLoader 实现。
  3. Apps 类加载器(也称系统类加载器)。根据 Java 应用程序的类路径来加载 Java 类。一般来说,Java 应用程序的类都是由它来完成加载的,可以通过 ClassLoader.getSystemClassLoader() 来获取它。该类由 sun.misc.Launcher$AppClassLoader 来实现。
  • 每一个类加载器都有一个父装载器(parent class loader)。

3. 如何保证一个类被加载一次

  • 全盘负责委托机制
  • 解释:当一个 ClassLoader 加载一个 Class 的时候,这个 Class 所依赖的和引用的其他 Class 通常也是由这个 classloader 负责载入的。例如加载一个普通的 Demo 类,Apps 类加载器首先拿到这个类的 class 文件,先让 parent(父)类加载器也就是扩展(Extensions)类加载器处理。扩展(Extensions)类加载器拿到 class 文件后同样先让 parent(父)类加载器处理,也就是引导(Bootstrap)类加载器会先处理属于它应该加载的部分。引导类加载器处理完成后,把剩下的给扩展类加载器。扩展类加载器处理属于它的内容,将剩下的部分交给 Apps 类加载器,Apps 类加载器会加载剩下的全部内容。
  • 每个类加载器只会加载自己负责的部分。
  • 这样每个类只会被加载一次。
正文完
 0