JVM ClassLoader机制 【转载的】

1)三个类加载器:bootstrap

bootstrap classloader - 引导(也称为原始)类加载器,它负责加载Java的核心类。jvm

extension classloader - 扩展类加载器,它负责加载JRE的扩展目录中JAR的类包。url

system classloader - 系统(也称为应用)类加载器,加载应用程序的类。spa

bootstrap classloader不是一个真正的ClassLoader实例orm

2)获取引导类加载器加载了哪些类:继承

URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs();
     for (int i = 0; i < urls.length; i++) {
         System.out.println(urls.toExternalForm());
     }
ssl

3)获取应用类加载器:get

ClassLoader.getSystemClassLoader()it

4)JVM类加载机制:全盘负责委托机制io

全盘负责:当一个classloader加载一个Class的时候,这个Class所依赖的和引用的全部Class也由这个classloader负责载入,除非是显式的使用另一个classloader载入;
委托机制:先让parent(父)类加载器(而不是super,它与parent classloader类不是继承关系)寻找,只有在parent找不到的时候才从本身的类路径中去寻找。

Cache机制:若是cache中保存了这个Class就直接返回它,若是没有才从文件中读取和转换成Class,并存入cache,这就是为何咱们修改了Class可是必须从新启动JVM才能生效的缘由。

5)每一个ClassLoader加载Class的过程是:
1.
检测此Class是否载入过(即在cache中是否有此Class),若是有到8,若是没有到22.若是parent classloader不存在(没有parent,那parent必定是bootstrap classloader了),到43.请求parent classloader载入,若是成功到8,不成功到54.请求jvm从bootstrap classloader中载入,若是成功到85.寻找Class文件(从与此classloader相关的类路径中寻找)。若是找不到则到7.6.从文件中载入Class,到8.7.抛出ClassNotFoundException.8.返回Class.其中5.6步咱们能够经过覆盖ClassLoader的findClass方法来实现本身的载入策略。甚至覆盖loadClass方法来实现本身的载入过程。

相关文章
相关标签/搜索