JVM的2种类加载器
前言:要想在大JAVA邻域有所建树,JVM是必须要懂的。然而要领悟JVM,它的类加载器更应理解了。所以一来为了自己以后看,二来也希望可以帮到有相同需要的同仁。我就写了这个博客,不周之处还望指正,共同切磋交流。
首先来理清一下概念,所谓的类加载器(class loader):就是用来加载java类到java虚拟机中。其实这就是java与C或C++的区别,java程序并不是一个可执行的文件,它由许多的类文件组成。每一个类文件对应一个Java类。那么是不是运行时把他们全都加入到内存中呢?答案是:NO。它们是根据需要来逐渐加载。
以是否是自带来划分,类加载器分为2种:
(1)JVM自带类加载器:
<1>根类加载器Bootstrap(它是用C++写的):引导类装入器是用本地代码实现的类装入器,它负责将 <Java_Runtime_Home>/lib下面的核心类库或-Xbootclasspath选项指定的jar包加载到内存中。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。
<2>扩展类加载器Extension(它是java写的):扩展类加载器是由Sun的ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的。它负责将< Java_Runtime_Home >/lib/ext或者由系统变量-Djava.ext.dir指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。
<3>系统类加载器System(它是java写的):是由 Sun的 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。它负责将系统类路径java -classpath或-Djava.class.path变量所指的目录下的类库加载到内存中。开发者可以直接使用系统类加载器。
(2)自定义类加加载器:
不好列举,但都是java.lang.ClassLoader的子类,好处在于可以定制类的加载方式。
为了大家好理解,我找了个图:
图 1. 类加载器树状组织结构示意图