引子:
 
    类加载器(classloader)是独立于虚拟机之外,可以独立实现的代码模块。

    OSGi使用了类加载器的这一特点实现其热插拔的特性
 
    Java同C++等语言不通,其连接操作不是在编译期间进行的,而是在程序运行期间进行的,这也就为java的动态扩展的语言特性提供了基础。
 

首先介绍下虚拟机的类加载机制:

    类加载的时机:

 
        类被从加载到虚拟机内存开始,到卸出内存为止,整个生命周期包括了以下七个过程:
 
        加载 - 验证 - 准备 - 解析 - 初始化 - 使用 - 卸载 
 
    加载:
 
        1. 通过一个类的全限定名获取定义此类的二进制流(决定了这个类的二进制流可以从zip包、jar包、计算时生成、网络甚至数据库中读取)
 
        2. 将字节流代表的静态存储结构转化为方法区的运行时数据结构
 
        3. 在java堆中生成一个代表该类的class对象
 
    验证:
    
        首先java编译器会对代码进行验证,不合要求的指令不会通过编译,但虚拟机因执行字节码,也需要对字节码进行验证。
 
        不同的虚拟机实现对验证有着不同的定义
 
    准备、解析、初始化
 
下面是类加载器:
 
    类加载器在Java虚拟机外部去实现,以便让应用程序自己去获取所需要的类。
 
    类加载器虽然只用于实现类的加载动作,但都需要类加载器和类本身来共同确认两个类是否相同,也就是说如果同一个class类被不同的类加载器加载,这两个类仍然是不同的
 
    双亲委派模型:
 
        从java虚拟机的角度来看,只有两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),该加载器由C++实现,是虚拟机的一部分
 
        另外一种就是其他的类加载器,这些加载器由Java实现,独立于虚拟机外并且全部继承自抽象类java.lang.ClassLoader
 
        如果更为细分,可以分为如下三种:
 
            启动类加载器(BootStrap ClassLoader)
 
                        该类负责加载存放在<JAVA_HOME>\lib目录中的,或者被-Xbootclasspath参数制定的,并且是虚拟机识别(文件名唯一识别,否则不加载,即使放到了对应目录下)的类库加载到虚拟机内存中去,该启动类无法被Java程序直接引用。
 
            扩展类加载器(Extension ClassLoader)
 
                        该加载器由sun.misc.Launcher$ExtClassLoader实现,负责加载<JAVA_HOME>\lib\ext目录中的,或者被java.ext.dirs系统变量所指定的类库,可以直接使用
 
            应用程序类加载器(Application ClassLoader)
 
                        由sun.misc.Lanucher$AppClassLoader实现,该加载器是ClassLoader中的getSystemClassLoader()方法的返回值,所以一般也称系统类加载器。负责加载用户路径(-classpath)上的类库,开发者可以直接使用该加载器,如果没有显示定义,一般情况下使用的就是该类加载器
 
        下图为类加载器的双亲委派模型:
 
      
 
        双亲委派模型除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类实现,该实现不是通过继承来实现的,而是通过组合来实现的,通过这样的层次关系,实现了类加载的优先级。
 
破坏双亲委派模型:
 
    双亲委派模型并非强制性约束,而是java设计者推荐的类加载器实现模型。破坏双亲委派模型的两个典型是:
 
    JDNI和OSGi
 
    OSGi实现其热部署的关键是其自定义类加载器的实现,每个程序模块(Bundle)都有自己的一个实现,当需要替换bundle时,会将类加载器一同替换以实现热替换。OSGi中的类加载器已经不再具有双亲委派这种具有典型层次结构特征了,而是更加类似于网状结构。
 
    
    

深入理解Java虚拟机 - 类加载器的更多相关文章

  1. Java虚拟机类加载器及双亲委派机制

    所谓的类加载器(Class Loader)就是加载Java类到Java虚拟机中的,前面<面试官,不要再问我"Java虚拟机类加载机制"了>中已经介绍了具体加载class ...

  2. 深入理解java虚拟机----->垃圾收集器与内存分配策略(下)

    1.  前言 内存分配与回收策略 JVM堆的结构分析(新生代.老年代.永久代) 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保  2.  垃圾 ...

  3. 深入理解Java虚拟机---类加载机制(简略版)

    类加载机制 谈起类加载机制,在这里说个题外话,当初本人在学了两三个月的Java后,只了解了一些皮毛知识,就屁颠屁颠得去附近学校的招聘会去蹭蹭面试经验,和HR聊了一会后开始了技术面试,前抛出了两个简单的 ...

  4. Java 虚拟机类加载器

    虚拟机设计团队把类加载阶段张的”通过一个类的全限定名来获取此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代码模块称为”类加载器”. ...

  5. 深入理解Java虚拟机-类加载连接和初始化解析

    不管学习什么,我一直追求的是知其然,还要知其所以然,对真理的追求可以体现在方方面面.人生短短数十载,匆匆一世似烟云,我认为,既然来了,就应该留下一些有意义的东西.本系列文章是结合张龙老师的<深入 ...

  6. 深入理解Java虚拟机类加载机制

    1.类加载时机 对于类加载的第一个阶段---加载,虚拟机没有强制的约束,但是对于初始化阶段,虚拟机强制规定有且只有以下的5中情况必须开始初始化,当然,加载.验证.准备阶段在初始化前就已经开始. ①使用 ...

  7. 深入理解JAVA虚拟机 垃圾收集器和内存分配策略

    引用计数算法 很多教科书判断对象是否存活的算法是这样的:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器都为0的对象就是不可能再被使用的 ...

  8. 深入理解java虚拟机---垃圾收集器和分配策略-1

    博文重点: 学习目标:哪些内存需要回收 什么时候回收    如何回收 在基于概念讨论的模型中,主要对Java堆和方法区进行讨论. why?:一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个 ...

  9. [深入理解Java虚拟机]<垃圾收集器与内存分配策略>

    Overview 垃圾收集考虑三件事: 哪些内存需要回收? 什么时候回收? 如何回收? 重点考虑Java堆中动态分配和回收的内存. Is Object alive? 引用计数法 给对象添加一个引用计数 ...

随机推荐

  1. shopnc 商城源码阅读笔记--开篇概述

    关于shopnc 以下是摘抄自百度百科的关于shopnc的介绍: ShopNC商城系统,是天津市网城天创科技有限责任公司开发的一套多店模式的商城系统. 本系统具有商城系统非常完整和专业的功能与流程,系 ...

  2. php删除html标签的三种解决方法

    分享下PHP删除HTMl标签的三种方法. 方法1:直接取出想要取出的标记 <?php //取出br标记 function strip($str) { $str=str_replace(" ...

  3. 【Delphi】无标题移动窗体

    procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Inte ...

  4. c语言文件操作函数详解

    一.文件操作注意点: 1 打开文件时,如果打开方式加“+”,表示该文件可以“写” ; 2 退出程序一般用exit函数,正常退出参数为0,非正常退出参数为正零值 ; 3 文件的读写操作:按字符.字符串. ...

  5. 分享自lordinloft 《[转载]COMPILE_OPT 的用法介绍》

    来源:http://blog.sina.com.cn/s/blog_63180b75010117oj.html#bsh-73-372143085

  6. c#教程之事件处理函数的参数

    事件处理函数一般有两个参数,第一个参数(object sender)为产生该事件的对象的属性Name的值,例如上例单击标题为红色的按钮,第一个参数sender的值为button1.如上例标题为红色的按 ...

  7. Unity3d之UGUI- Image拦截Button响应事件

    在编辑UI的时候Image放在Button前面就会挡掉button的响应 这种情况只需要为Image添加CanvasGroup組件 按照这个属性配置就不会挡掉后面的事件了

  8. python学习笔记15(面向对象编程)

    虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程. 一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界 ...

  9. ios设备 分辨率(转)

    1 iOS设备的分辨率 iOS设备,目前最主要的有3种(Apple TV等不在此讨论),按分辨率分为两类 iPhone/iPod Touch 普屏分辨率    320像素 x 480像素 Retina ...

  10. Extjs-4.2.1(二)——使用Ext.define自定义类

    鸣谢:http://www.cnblogs.com/youring2/archive/2013/08/22/3274135.html --------------------------------- ...