Jvm的类加载器

 

1,类装载工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java执行时系统组件,它负责在运行时查找和装入Class字节码文件。

2,JVM在运行时会产生三个ClassLoader:

根装载器、ExtClassLoader(扩展类装载器)和AppClassLoader(系统类装载器)。

其中,根装载器不是ClassLoader的子类,它使用C++编写,因此我们在Java中看不到它,根装载器负责装载JRE的核心类库,如JRE目标下的rt.jar、charsets.jar等。

ExtClassLoader和AppClassLoader都是ClassLoader的子类。其中:

ExtClassLoader负责装载JRE目录ext中的JAR类包;

AppClassLoader负责装载ClassPath路径下的类包。

启动类加载器(Bootstrap ClassLoader):这个类加载器负责将存放在\lib目录中的。启动类加载器无法被Java程序直接引用,用户在编写自定义类加载器时,

如果需要把加载请求委派给引导类加载器,那直接使用null代替即可。

扩展类加载器(Extension ClassLoader):这个加载器由sun.misc.Launcher$ExtClassLoader实现,它负责加载\lib\ext目录中的,

或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。

应用程序类加载器(Application ClassLoader):这个类加载器由sun.misc.Launcher$AppClassLoader实现。由于这个类加载器是ClassLoader中的getSystemClassLoader()方法的返回值,

所以一般也称它为系统类加载器。它负责加载用户类路径(ClassPath)上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义自己的类加载器,

一般情况下这个就是程序中默认的类加载器。

3,jvm加载顺序:BoopStrap ClassLoder-〉ExtClassLoader->AppClassLoder

4,类加载器之间的父子关系(未自定义类加载器即访问顺序AppClassLoder,〉ExtClassLoader,BoopStrap ClassLoder)

AppClassLoader的父加载器为ExtClassLoader,ExtClassLoader的父加载器为null,BoopStrap ClassLoader为顶级加载器。

5,类加载机制-双亲委托加载机制(加载器加载过程会涉及调用得几个方法(1)loadClass (2)findLoadedClass (3)findClass )

例如:当jvm要加载Test.class的时候,

   (1)首先会到自定义加载器中查找,看是否已经加载过,如果已经加载过,则返回字节码。

   (2)如果自定义加载器没有加载过,则询问上一层加载器(即AppClassLoader)是否已经加载过Test.class。

   (3)如果没有加载过,则询问上一层加载器(ExtClassLoader)是否已经加载过。

   (4)如果没有加载过,则继续询问上一层加载(BoopStrap ClassLoader)是否已经加载过。、

   (5)如果BoopStrap ClassLoader依然没有加载过,则到自己指定类加载路径下("sun.boot.class.path")查看是否有Test.class字节码,有则返回,

没有通知下一层加载器ExtClassLoader到自己指定的类加载路径下(java.ext.dirs)查看。

   (6)依次类推,最后到自定义类加载器指定的路径还没有找到Test.class字节码,则抛出异常ClassNotFoundException。

7,自定义类加载器步骤

(1)继承ClassLoader (2)重写findClass()方法 (3)调用defineClass()方法

8,自定义类加载器的作用:jvm自带的三个加载器只能加载指定路径下的类字节码。如果某个情况下,我们需要加载应用程序之外的类文件呢? 比如本地D盘下的,或者去加载网络上的某个类文件,这种情况就可以使用自定义加载器了。(调用某台服务器的某个class文件的方法)

你可能感兴趣的:(JVM,性能,JVM)