`
wade6
  • 浏览: 270150 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JVM的ClassLoader

    博客分类:
  • jvm
 
阅读更多

一、 什么是ClassLoader?

 

“A class loader is an object that is responsible for loading classes”——java.lang.ClassLoader;

显而易见,classLoader就是类加载器的意思,通过它将类(从.class文件到jvm中的class)加载到jvm中;

但是classLoader也是一个Object,它是怎么加载到jvm中的呢,不是所有的java类都是通过classLoader加载的吗?

所以,肯定有一个classLoader不需要通过类加载来装入jvm;

jvm中的bootstrap classloader就是这样的一个类加载器,它是jvm实现的一部分。

 

二、   JVM有哪些ClassLoader?

 

明白了什么是classLoader,那么classLoader有哪些呢?

 

上面提到JVM自己实现了一个ClassLoader——BootstrapClassLoader;和JVM一样,BootstrapClassLoader是用本地代码实现的,它负责加载核心JavaClass(即所有java.*开头的类)。

另外,jvm还提供了两个类加载器,ExtensionClassLoader和SystemClassLoader;

他们都是用java编写的,都是java.lang.ClassLoader的子类,由Bootstrap ClassLoader加载后才能使用;

其中Extension ClassLoader负责加载扩展的Javaclass(例如所有javax.*开头的类和存放在JRE的ext目录下的类),System ClassLoader负责加载应用程序自身的类。

当然,开发者自己也可以实现自定义的classLoader。

 

总之,JVM中包含的ClassLoader有:

  • Bootstrap ClassLoader,负责加载核心JavaClass(例如所有java.*开头的类)
  • Extension ClassLoader,负责加载扩展的Javaclass(由变量-Djava.ext.dirs决定,默认为jdk1.6.0_32/jre/lib/ext;/usr/java/packages/lib/ext),
  • System ClassLoader,负责加载应用程序自身的类。

这三个类加载器存在parent关系,但这个parent不是指的继承的关系,而是他们的实例被谁加载的关系; System ClassLoader的Parent是Extension ClassLoader,而Extension ClassLoader的Parent为Bootstrap ClassLoader。

 

 

理论总是枯燥的,还是动手实现吧,通过代码查看他们parent,如下:

 

public static void main(String[] args) {
	     System.out.println(ClassLoader.getSystemClassLoader().getParent());
	     System.out.println(ClassLoader.getSystemClassLoader().getParent().getParent());
}

输出为:

 sun.misc.Launcher$ExtClassLoader@42e816
 null

 

ExtClassLoader的parent不是java类,所以为null。

 

--------------------------------------------------------------------------------------

补充:类加载器对应的java类

bootstrap classloader --------  对应jvm中某c++写的dll类

Extenson ClassLoader ---------对应Launcher内部类ExtClassLoader

System ClassLoader   --------对应Launcher内部类AppClassLoader

User Custom ClassLoader  ---对应任何自定义的URLClassLoader子类(也可以继承SecureClassLoader或者直接继承ClassLoader)

--------------------------------------------------------------------------------------

 

三、   ClassLoader加载机制

 

classloader 加载类用的是全盘负责双亲委托机制;

全盘负责就是加载一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入;

双亲委托机制则是先让parent类加载器寻找,只有在parent找不到的情况下才在自己的类路径中去寻找;

此外类加载还采用了cache机制,如果 cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换Class,并存入cache;这就是为什么我们修改了Class但是必须重新启动JVM才能生效的原因。

 

四、  ClassLoader加载class的过程

 

知道了classLoader的加载机制,那么加载class的过程也就很容易理解了,如下:

1) 检测此Class是否载入过(即在cache中是否有此Class),如果有到8,如果没有到2

2) 如果parent classloader不存在(没有parent,那parent一定是bootstrap classloader了),到4

  3) 请求parent classloader载入,如果成功到8,不成功到5

4) 请求jvm从bootstrap classloader中载入,如果成功到8

5) 寻找Class文件(从与此classloader相关的类路径中寻找)。如果找不到则到7.

6) 从文件中载入Class,到8.

7)  抛出ClassNotFoundException.

8)  返回Class.

其中5.6步我们可以通过覆盖ClassLoader的findClass方法来实现自己的载入策略。甚至覆盖loadClass方法来实现自己的载入过程。

 

五、自定义ClassLoader

 

现在已经了解了classloader的原理和加载机制,那么我们可以实现一个自定义的classLoader。

       实现自定义classLoader,我觉得最根本的目的是为了使用自定义的classPath,其实有多种方式来满足这个需求,例如

  • 生成URLClassLoader的时候指定自定义的classPath,可以实现运行时的动态加载;
  • 通过继承URLClassLoader来实现自定义的classLoader,使用URLClassLoader的寻址逻辑,加载自定义的ClassPath;
  • 通过继承ClassLoader来实现自定义的classLoader,可以实现自定义的classPath寻址和class文件的读取;

当然还有其他的方式可以实现自定义的classLoader,重要的是根据不同的需求来实现合适的ClassLoader。

 

分享到:
评论

相关推荐

    JVM ClassLoader简析

    JVM ClassLoader简析.压缩包中文档和示例代码

    JAVA笔试总结 -- 非常全面

    native,transient,volatile,strictfp,CMM,synchronized,java socket,压缩与解压缩,多线程,垃圾回收算法,JVM ClassLoader,IO流,反射机制,JNDI, GUI布局管理器,JMS, Java Mail, JNDI reference,java事件处理...

    Java基础知识点 - 内容比较全面

    1.5 JVM ClassLoader机制 1.6 Java中的synchronized使用 1.7 Java中的反射机制 1.8 Java中Heap与Stack的区别 1.9 Java中String和StringBuffer的区别 1.10 Java中Comparable和Comparator实现对象比较 1.11 Java...

    JVM.zip_JVM代理_classloader

    运用代理模式,通过自定义classloader对代码加密,啊;敌法;打飞机

    探索JVM底层奥秘ClassLoader源码分析与案例讲解

    探索JVM底层奥秘ClassLoader源码分析与案例讲解,探索JVM底层奥秘ClassLoader源码分析与案例讲解.

    JVM类加载机制详细讲解

    讲解JVM的ClassLoader子系统原理.

    ClassLoader运行机制 自己写的

    ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的

    JVM基础.doc

    • JVM指令介绍,获得ClassLoader的途径,CAS指令由硬件提供 • 并发程序设计实现的基础 • 486之后并不需要锁总线 • 基于MESI缓存⼀一致性协议 如果不声明volatile,变量装载到本地变量 中,或者cpu cache中,多...

    深入JVM内核 - 原理、诊断与优化

    目前,Java是最为流行的编程语言之一,它的基础平台就是JVM。除了Java,如JRuby、Scala、Clojure等语言也运行在JVM平台。熟悉和掌握JVM平台有着重要的实用价值和意义。 在本课程中个,将详细介绍JVM的基本原理、...

    深入Java虚拟机JVM类加载学习笔记

    深入Java虚拟机JVM类加载学习笔记:jvm java classloader 垃圾回收 gc

    Java ClassLoader

    Java中ClassLoader的解析,从ClassLoader的角度分析了JVM,装载类,创建类的对象的整个过程,更清晰的了解JVM的运行机制。

    深入理解ClassLoader工作机制.docx

    JVM内存模型,类加载模式工作机制详细,内存屏障,类从被加载到虚拟机内存中开始,直到卸载出内存为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解析这三...

    ClassLoader 详解.doc

    关于J2EE服务器的ClassLoader的原理,该文档清晰了揭示了jvm装载类的顺序,同时用户可以自定义修改classLoader的配置 通过该文档,可以加深对Java虚拟机的理解

    java ClassLoader机制及其在OSGi中的应用

    内容简介: ClassLoader体系结构 类装载器在JVM中并不是唯一的,JVM自带了三个装载器,用户也可以根据自己的需求自定义新的装载器,这些装载器的体系结构可以看作是树状结构,如图1所示:

    Understanding the Java ClassLoader

    Understanding the Java ClassLoader

    JVM基础教程

    有关JVM的基础教程。介绍JVM原理:hotspot、classfile、classloader、内存模型、锁、同步、JVM内存管理和垃圾收集。

    java深度历险

    java深度历险 经典研读系列:深入浅出介绍java jvm classpath classloader import

    【图解版】深入分析ClassLoader类加载工作机制

    【图解版】深入分析ClassLoader类加载工作机制,从原理到JVM的装载过程,详情分析了ClassLoader加载类以及自定义类加载器的过程,不可用于商业用途,如有版权问题,请联系删除!

Global site tag (gtag.js) - Google Analytics