引子:
 
    类加载器(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. window下安装composer和laravel

    安装composer: 1.在https://getcomposer.org/download/ 中下载 Composer-Setup.exe 2.安装composer步骤如下: 至此,compose ...

  2. php微信支付(仅Jsapi支付)详细步骤.----仅适合第一次做微信开发的程序员

    本人最近做了微信支付开发,是第一次接触.其中走了很多弯路,遇到的问题也很多.为了让和我一样的新人不再遇到类似的问题,我把我的开发步骤和问题写出来,以供参考. 开发时间是2016/8/2,所以微信支付的 ...

  3. 使用PHP获取汉字的拼音(全部与首字母)

    <?php /** * 取汉字拼音 * edit by www.jbxue.com */ class GetPingYing { private $pylist = array( 'a'=> ...

  4. php入门变量之数字

    在介绍变量时,我明确指出PHP具有整型和浮点型(小数)数字类型.但是,依据我的经验,这两种类型都可以归类到一般的数字之下(在极大程度上是这样的). 下面列举下PHP中有效的数字类型的变量: 8 3.1 ...

  5. ACM俱乐部 字符串

    数制转换分数: 2 时间限制:1 秒 内存限制:32 兆 特殊判题: 否 提交:59 解决: 24 标签 进制转换 题目描述 求任意两个不同进制非负整数的转换(2进制-16进制),所给整数在long所 ...

  6. CodeForces 18C

    Description Once Bob took a paper stripe of n squares (the height of the stripe is 1 square). In eac ...

  7. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  8. ThinkPHP的缓存 F方法

    一般使用文件方式的缓存就能够满足要求,而thinkphp还提供了一个专门用于文件方式的快速缓存方法f方法. 由于采用的是php返回方式,所以其效率较s方法较高. f方法具有如下特点: 1.简单数据缓存 ...

  9. Oracle全表扫描

    优化器在形成执行计划时需要做的一个重要选择——如何从数据库查询出需要的数据.对于SQL语句存取的任何表中的任何行,可能存在许多存取路径(存取方法),通过它们可以定位和查询出需要的数据.优化器选择其中自 ...

  10. POJ 2411 压缩状态DP

    这个题目非常赞! 给定一个矩形,要求用1*2 的格子进行覆盖,有多少种覆盖方法呢? dp[i][j] 当状态为j,且第i行已经完全铺满的情况下的种类数有多少种?j中1表示占了,0表示没有被占. 很显然 ...