JVM(2)类加载器与双亲委派机制

类加载器

运行图:
JVM(2)类加载器与双亲委派机制

类加载器是负责将可能是网络上、也可能是磁盘上的class文件加载到内存中。并为其生成对应的java.lang.class对象。一旦一个类被载入JVM了,同一个类就不会被再次加载。那么怎样才算是同一个类?在JAVA中一个类用其全限定类名(包名和类名)作为其唯一标识,但是在JVM中,一个类用其全限定类名和其类加载器作为其唯一标识。也就是说,在JAVA中的同一个类,如果用不同的类加载器加载,则生成的class对象认为是不同的。

类加载的分类

当JVM启动时,会形成由三个类加载器组成的初始类加载器层次结构:
 
1、启动类加载器BootstrapClassLoader:

是嵌在JVM内核中的加载器,该加载器是用C++语言写的,主要负载加载JAVA_HOME/lib下的类库,启动类加载器无法被应用程序直接使用。

2、扩展类加载器Extension ClassLoader:

该加载器器是用JAVA编写,且它的父类加载器是Bootstrap,是由sun.misc.Launcher$ExtClassLoader实现的,主要加载JAVA_HOME/lib/ext目录中的类库。

3、系统类加载器App ClassLoader:

系统类加载器,也称为应用程序类加载器,负责加载应用程序classpath目录下的所有jar和class文件。它的父加载器为Ext ClassLoader。

双亲委派机制

java内部类(自定义的类)的最终执行在BootStarp。
App ClassLoader(有)->Extension ClassLoader(有)->BootstrapClassLoader(有,则执行)。
我们写的类执行流程。
App ClassLoader(有)->Extension ClassLoader(无)->BootstrapClassLoader(无)->Extension ClassLoader(无)
->App ClassLoader(有,则执行)。