2020年面试题------JVM的三种类加载器介绍

        类经过java文件编码成.class文件,通过、jvm虚拟机启动时,会将.class文件拆分成四分五裂的,通过一个.class对象来调用它,这就是类加载器,并为之生成的java.lang.Class对象 .

JVM中的类的加载器主要有三种:启动类加载器,拓展类加载器,应用类加载器。

  • (引导类)启动类加载器(Bootstrap classLoader):又称为引导类加载器,由C++编写,无法通过程序得到。主要负责加载JAVA中的一些核心类库,主要是位于<JAVA_HOME>/lib/rt.jar中。
  • 拓展类加载器(Extension classLoader):主要加载JAVA中的一些拓展类,位于<JAVA_HOME>/lib/ext中,是启动类加载器的子类。
  • 应用类加载器(System classLoader): 又称为系统类加载器,主要用于加载CLASSPATH路径下我们自己写的类,是拓展类加载器的子类。

类加载器的三大特性:委托性、可见性、单一性

委托性: 每个类中都有一个自己的类加载器的属性,这也就是为什么可以通过Student.class.getClassLoader()来    获取自己的类加载器。当一个类加载器要加载一个类时,它会先委托自己的父类加载器来加载,只有当父加载器无法加载类时,才会自己去加载。例如我们写了一个类Student,它的类加载器是System ClassLoader,它首先会委托给它的父加载器即Extension ClassLoader,然后Extension ClassLoader又会委托给它的父加载器BootStrap ClassLoader,启动类加载器无法加载这个类,交给拓展类加载器,拓展类加载器也无法加载,然后才轮到系统类加载器进行加载。

可见性:可见性指的是父加载器无法利用子加载器加载的类,而子加载器可以利用父加载器加载的类。

单一性:一个类只会被一个类加载器加载一次,不会被重复加载。
 

注意:拓展类加载器和应用类加载器是Java编写的,当JVM启动时,它们会由启动类加载器加载,启动类加载器是由C++编写的,内嵌于JVM之中,是JVM的一部分机器码。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章