面试题之类加载器

一、简介

本文总结一些关于JVM中类加载器相关的面试题。

二、什么是类加载器?

类加载器,负责加载class字节码文件,class文件在文件开头有特定的文件标识,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由执行引擎Execution Engine决定。

类加载器的工作图大体如下:

面试题之类加载器_第1张图片

三、类加载器有哪几种?

在Java中,类加载器主要有下面四种:

  • BootstrapClassLoader:启动类加载器,使用C++实现;
  • ExtClassLoader:扩展类加载器,使用Java实现;
  • AppClassLoader:应用程序类加载器,加载当前应用的classpath的所有类;
  • UserDefinedClassLoader:用户自定义类加载器;

面试题之类加载器_第2张图片 

下面通过一个简单的代码说明类加载器的关系:

public class Test {
    public static void main(String[] args) {
        /*
         * 启动类加载器:null
         * 由于底层基于C++实现,所以返回null.因为Object类位于rt.jar包中,由启动类加载器进行加载.
         */
        System.out.println(Object.class.getClassLoader());

        /*
         * 自定义类Test.java
         */
        Test test = new Test();
        /*
         * 应用程序类加载器: sun.misc.Launcher$AppClassLoader@18b4aac2
         * 对于自定义的类,如Test.java。默认都是应用程序类加载器
         */
        System.out.println(test.getClass().getClassLoader());
        /*
         * 扩展类加载器:sun.misc.Launcher$ExtClassLoader@1540e19d
         * 应用程序类加载器的父类是扩展类加载器
         */
        System.out.println(test.getClass().getClassLoader().getParent());
        /*
         * 启动类加载器:null
         * 扩展类加载器的父类是启动类加载器
         */
        System.out.println(test.getClass().getClassLoader().getParent().getParent());
    }
}

运行结果:

null
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@1540e19d
null

三、双亲委派机制?

类加载器的加载过程中使用到了双亲委派机制:当一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一个层次类加载器都是如此,因此所有的加载请求都应该传送到启动类加载器(BootstrapClassLoader)中,只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的Class),子类加载器才会尝试自己去加载。

好处:

比如加载位于 rt.jar 包中的类 java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个 Object对象。

四、沙箱安全机制?

沙箱安全机制是由基于双亲委派机制上采取的一种JVM的自我保护机制,假设我们自定了一个java.lang.String 的类,由于双亲委派机制,加载请求会先交给BootstrapClassLoader启动类加载器试图去进行加载,但是BootstrapClassLoader在加载类时首先通过包和类名查找rt.jar中有没有java.lang.String,有则优先加载rt.jar包中的类,由于rt.jar中已经包含了java.lang.String类,所以我们自定义的String类永远得不到加载(当然编译是不会报错的),它保证了Java源代码的安全。

你可能感兴趣的:(面试题,JVM虚拟机)