首先来了解几个概念:

类加载:

概念:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验--转换解析--初始化,最终形成能被java虚拟机直接使用的java类型,就是jvm的类加载机制。

类加载包含了以下过程:加载--验证--准备--解析--初始化--使用--卸载

类加载器:

    首先,什么是类加载器?

概念:把类加载阶段中"通过一个类的全限定名来获取描述此类的二进制流"这个动作放到jvm外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块被称为"类加载器"。

分类:(针对hot spot而言,因为MRP,maxine的虚拟机完全是由java实现)

站在java虚拟机的角度上讲,只存在两种不同的类加载器。启动类加载器 和 其他类加载器。

启动类加载器:由c++实现,是虚拟机自身的一部分.

其他类加载器:由java实现,独立于虚拟机外部,全继承于抽象类java.lang.ClassLoader.

站在java开发人员的角度上讲  ,分为三种

*启动类加载器(BootStrap ClassLoader):  前面已经提到,主要加载<JAVA_HOME>/lib目录中 ,或被-Xbootclasspath参数指定路径中的jar包。

*扩展类加载器(Extension ClassLoader):由sun.misc.Launcher$ExtClassLoader来实现。主要加载<JAVA_HOME>/lib/ext 目录中 ,或被java.ext.dirs系统变量指定路径中所有类库。

*应用程序类加载器(Application ClassLoader):由sun.misc.Launcher$AppClassLoader来实现。由于这个类加载器是ClassLoader中getSystemClassLoader()方法返回值,所以也叫系统类加载器。负责加载用户类路径上(ClassPath)指定的类库,是开发过程中默认的加载器,开发者可直接使用。

说到这里,不得不提一下"双亲委派模型(Parent Delegation Model)"。如上图。

双亲委派模型:描述类加载器之间的层次关系的就是双亲委派模型。

双亲委派模型要求出顶层的 启动类加载器 外,其余类加载器都应有自己的父类加载器。

加载器之间的父子关系不是靠继承的关系实现,是使用组合关系的关系来复用父类加载器的代码。

双亲委派模型工作过程:若一个类加载器收到类加载请求,他首先不会自己尝试去加载这个类,而是把这个请求委派给父类加载器去完成,每一层类加载器都是如此,所以所有请求都会传送到顶层的BootStrap ClassLoader,只有当父类加载器反馈自己无法完成这个加载请求(它的搜索范围没找到),子加载器才会自己尝试去加载。

使用双亲委派模型好处:

java类以及它的类加载器一起具备了一种带有优先级的层次关系。如 java.lang.Object(它在rt.jar之中)。

首先我们要知道一点,同一个类 被不同的 类加载器 加载成两个类之后,这两个类是不同的。

如果java.lang.Object类被不同的类加载器加载很多次,jvm中存在了多个不同的Object类,那么java类型体系中最基础的行为也无从保证,应用程序会一片混乱(we know,all the class extends from java.lang.Object,如果Object存在多个品种,那绝对是灾难)。

相反,使用了双亲委派模型,无论哪个类加载器去加载,都会委派到BoorStrap ClassLoader进行加载,保证了Object在各个类加载器环境中,都是同一个类。

再提一点双亲委派模型的工作机制,以类 A 为例,A如果以Application ClassLoader方式来加载,Application ClassLoader委派给Extension ClassLoader,再到BootStrap ClassLoader.

然而,BootStrap ClassLoader管理范围内(<JAVA_HOME>/lib目录中 ,或-Xbootclasspath参数指定路径中的jar包)没查到类A,那么就让最初请求的类加载器,Application ClassLoader来加载

at last,提一点,双亲委派模型 在jvm成长史上被重大破坏过三次,但是 双亲委派模型确实不错,还是像小强一样的活了下来

jvm类加载器以及双亲委派的更多相关文章

  1. JVM类加载器以及双亲委派模型

    从java开发人员的角度来看,类加载器可以分为3种: 1.启动类加载器(Bootstrap ClassLoader),负责将存放在<JAVA_HOME>\lib目录中,或者被-Xbootc ...

  2. [jvm] -- 类加载器及双亲委派模板篇

    类加载器 JVM 中内置了三个重要的 ClassLoader BootstrapClassLoader(启动类加载器):最顶层的加载类,由C++实现,负责加载 %JAVA_HOME%/lib目录下的j ...

  3. JVM——类加载器的双亲委派模型

    类加载器双亲委派模型,如下图所示: 双亲委派模型的工作过程 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此 ...

  4. jvm类加载器和双亲委派模型

    类加载器按照层次,从顶层到底层,分为以下三种:  (1)启动类加载器(Bootstrap ClassLoader)   这个类加载器负责将存放在JAVA_HOME/lib下的,或者被-Xbootcla ...

  5. 【深入理解JVM】类加载器与双亲委派模型

    原文链接:http://blog.csdn.net/u011080472/article/details/51332866,http://www.cnblogs.com/lanxuezaipiao/p ...

  6. JVM类加载机制详解(二)类加载器与双亲委派模型

    在上一篇JVM类加载机制详解(一)JVM类加载过程中说到,类加载机制的第一个阶段加载做的工作有: 1.通过一个类的全限定名(包名与类名)来获取定义此类的二进制字节流(Class文件).而获取的方式,可 ...

  7. 【深入理解JVM】:类加载器与双亲委派模型

    类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字 ...

  8. 【深入理解JVM】类加载器与双亲委派模型 (转)

    出处: [深入理解JVM]类加载器与双亲委派模型 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过 ...

  9. 类文件的结构、JVM 的类加载过程、类加载机制、类加载器、双亲委派模型

    一.类文件的结构 我们都知道,各种不同平台的虚拟机,都支持 "字节码 Byte Code" 这种程序存储格式,这构成了 Java 平台无关性的基石.甚至现在平台无关性也开始演变出 ...

随机推荐

  1. idea常用的插件

    ignore 插件 可以自动生成.ignore文件   非常的实用 gitee 插件 搜所gitee安装即可  码云的插件 maven helper 插件 idea 中解决maven 包冲突的问题 a ...

  2. IDEA中导入多个包自动合并为星号

    IDEA中导入同一个包下的几个class会自动合并为星号,如下图.可以通过设置让其不自动合并为星号. 1.选择File→Settings→Editor→Code style→Java,再点击右边的Im ...

  3. python-web开发环境搭建

    一.安装distribute或setuptools,我用的distribute 下载链接:https://pypi.python.org/pypi/distribute [root@yeebian o ...

  4. HDU - 3478 Catch(判奇环/二分图)

    http://acm.hdu.edu.cn/showproblem.php?pid=3478 题意 给一个无向图和小偷的起点,小偷每秒可以向相邻的点出发,问有没有一个时间点小偷可能出现在任何点. 分析 ...

  5. idea常用快捷键及自定义快捷键汇总

    以下都是挨个进行验证过的 生成get和set方法为:alt+insert 自动补全返回值,自动补全变量名称和属性名称:ctrl+alt+v 输入System.out.println()的快捷方法是:输 ...

  6. Mac下使用Wine安装PowerDesigner15

    下载: (链接: https://pan.baidu.com/s/1bpEYyIV 密码: 5ymj) 安装: 1.安装Wine 参考:http://www.cnblogs.com/EasonJim/ ...

  7. JavaScript/HTML/CSS 之 iframe自适应高度

    最高效简介的手段是利用CSS的内置calc函数: iframe{ height:calc(100vh - 50px) auto;//假令:html顶部有高度为50px的导航条 //min-height ...

  8. UE4中Bebavior Tree中Delay及其后面代码失效的原因

    具体原因是因为节点的执行过程中,该节点及其父节点的Decorator条件不满足,而节点又受到flow control的影响,导致中途强制结束了Task节点的执行,具体如下. UE4中的Behavior ...

  9. Java并发编程(1)-Java内存模型

    本文主要是学习Java内存模型的笔记以及加上自己的一些案例分享,如有错误之处请指出. 一 Java内存模型的基础 1.并发编程模型的两个问题 在并发编程中,需要了解并会处理这两个关键问题: 1.1.线 ...

  10. IOS中的三大事件

    iOS 中,所有显示在界面上的对象都是从 UIResponder 直接或间接继承的,只有继承了它才可以处理事件.而在ios中的事件可以分为三大类: 1.触摸事件 2.加速计事件(摇一摇) 3.远程控制 ...