论坛首页 入门技术论坛

JVM ClassLoader机制

浏览 1769 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-10-12   最后修改:2009-10-12

1)三个类加载器:

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

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

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

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

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

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

3)获取应用类加载器:

ClassLoader.getSystemClassLoader()

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

全盘负责:当一个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,如果没有到2
2.
如果parent classloader不存在(没有parent,那parent一定是bootstrap classloader了),到4
3.
请求parent classloader载入,如果成功到8,不成功到5
4.
请求jvmbootstrap classloader中载入,如果成功到8
5.
寻找Class文件(从与此classloader相关的类路径中寻找)。如果找不到则到7.
6.
从文件中载入Class,到8.
7.
抛出ClassNotFoundException.
8.
返回Class.
其中5.6步我们可以通过覆盖ClassLoaderfindClass方法来实现自己的载入策略。甚至覆盖loadClass方法来实现自己的载入过程。

 

 

相关链接:

★  Java基础知识点汇总 

★ 【下载】经典常用算法 Java和C语言两种实现(含代码图例)

【下载】Java各种排序算法实现(含代码)

 

 

论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics