JVM(16)之 双亲委派模型
在上一篇博文中,我们知道了如何获得二进制的字节流,并根据获得的字节流去装载一个类。同时也了解到类加载器的存在,每个加载器对应着不同的加载目录,相互配合着,从而使整个加载过程稳定而安全。
那么他们是如何配合的呢?如果我自己写一个类,名字叫做String可以吗?
首先我们来看一张图:
图中除了最底下的那个加载器是我们没有讲到的,其余的都有说到过。其实底下那个就是我们自己实现的类加载器,用于自定义加载class。
在虚拟机中,类的加载采用的是双亲委派模型。该模型需要有一个前提条件:除了顶层的类加载器之外,其余的类加载器都应该有自己的父加载器,这里的父加载器指的不是继承,而是组合,即App ClassLoader加载器里面应该要有Extension ClassLoader加载器的引用(为什么用组合而不用继承,大家可以想想其中的利弊)。
基本工作过程就是:当一个类加载器收到了类加载的请求,他首先不会尝试自己去加载这个类,而是将这次的请求委派给自己的父类加载器去加载。如果父类加载器依然不能加载,则继续用父加载器的父加载器去加载(有点拗口)。层层如此,如果都不能加载,则最终的结果就是到达顶层——启动类加载器Bootstrap ClassLoader。每一层的类加载器都会根据请求所要加载的类去自己应该加载的目录中搜索有没有对应的类和查看该类是否已经被加载。如果有,那么该层加载器加载并返回,如果到达了启动类加载器后还是不能加载,那么就由最初接收到类加载请求的那个类加载器进行加载。
因此,可以从图或者刚刚的工作过程看出:要加载类就先要检查是否已经加载了和是不是自己应该要加载的类,这个过程是自底向上的。那么如果上层反馈说该类没有被加载,并且我和我的父加载器都不能加载,你自己加载吧,这个过程是从上往下的。
我们来看看虚拟机是怎么实现该双亲模型的:
通过findLoadedClass判断是否已经加载了,如果加载了,则返回这个类,否则就判断有没有父加载器,如果有就交给父加载器加载。如果祖先都不能加载,就交给当前的加载器加载。
双亲委派模式很好地解决了各个类加载器的基础类统一问题,越基础的类由越上层的类加载器进行加载。分工与责任明确,解决部分安全问题,如自定义的加载器不能加载根加载器应该加载的类,很好的避免了恶意写入基础类。
例子:我们常用的String类位于rt.jar下。由上一博文的知识可以知道,该jar包是由Bootstrap ClassLoader进行加载的,那么如果我们自己写一个类也叫作String,那么当加载的时候,就会先检查出该类已经被加载了,所以不再允许其他的加载器重新加载,因此我们自己写的String类也就不能用了,所以我们不能自己写一个叫做String的类。
JVM(16)之 双亲委派模型的更多相关文章
- 类文件的结构、JVM 的类加载过程、类加载机制、类加载器、双亲委派模型
一.类文件的结构 我们都知道,各种不同平台的虚拟机,都支持 "字节码 Byte Code" 这种程序存储格式,这构成了 Java 平台无关性的基石.甚至现在平台无关性也开始演变出 ...
- 【深入理解JVM】类加载器与双亲委派模型
原文链接:http://blog.csdn.net/u011080472/article/details/51332866,http://www.cnblogs.com/lanxuezaipiao/p ...
- JVM总括四-类加载过程、双亲委派模型、对象实例化过程
JVM总括四-类加载过程.双亲委派模型.对象实例化过程 目录:JVM总括:目录 一. 类加载过程 类加载过程就是将.class文件转化为Class对象,类实例化的过程,(User user = new ...
- JVM类加载机制详解(二)类加载器与双亲委派模型
在上一篇JVM类加载机制详解(一)JVM类加载过程中说到,类加载机制的第一个阶段加载做的工作有: 1.通过一个类的全限定名(包名与类名)来获取定义此类的二进制字节流(Class文件).而获取的方式,可 ...
- 【深入理解JVM】:类加载器与双亲委派模型
类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字 ...
- jvm双亲委派模型
其实,双亲委派模型并不复杂.自定义类加载器也不难!随便从网上搜一下就能搜出一大把结果,然后copy一下就能用.但是,如果每次想自定义类加载器就必须搜一遍别人的文章,然后复制,这样显然不行.可是自定义类 ...
- JVM类加载过程与双亲委派模型
类加载过程 类加载过程为JVM将类描述数据从.class文件中加载到内存,并对数据进行解析和初始化,最终形成被JVM直接使用的Java类型.包含: 加载:获取该类的二进制字节流,将字节流代表的静态存储 ...
- JVM的类加载过程以及双亲委派模型详解
JVM的类加载过程以及双亲委派模型详解 这篇文章主要介绍了JVM的类加载过程以及双亲委派模型详解,类加载器就是根据指定全限定名称将 class 文件加载到 JVM 内存,然后再转化为 class 对象 ...
- JVM探究之 —— 类加载器-双亲委派模型
虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代码模块称为“类加载器 ...
随机推荐
- python-验证功能的装饰器示例
user_list=[ {'}, {'}, {'} ] current_dict={'username':None,'login':False} def auth(auth_type): def au ...
- hashlib模块subprocess模块
'''通过一种算法,将字符串得出一种编码内容相同则hash运算结果相同,内容稍微改变则hash值改变不可逆推相同算法,无论校验多长的数据,得到的hash值长度固定'''# import hashlib ...
- hdu 5212 : Code【莫比乌斯】
题目链接 题给代码可以转化为下面的公式 然后用F[n]记录公约数为n的(a[i],a[j])对数,用f[n]记录最大公约数为n的(a[i],a[j])对数 之后枚举最大公约数d 至于求F[n],可以先 ...
- 进入cmd的另外的一种方式
按Shift键+鼠标右键 进入powershell ,进入的界面和普通的shell界面不一样
- 使用 Visual Studio 调试器附加到运行的进程
为什么调试附加进程? Visual Studio 调试器可以附加到在 Visual Studio 外运行的进程. 可以使用此附加功能执行以下操作: 调试并非在 Visual Studio 中创建的应用 ...
- Python_008(文件操作)
一.文件操作 1.只读操作 f = open("taibai.txt",mode = "r",encoding = "utf-8" s = ...
- 纯CSS实现项目展示遮罩详情效果
本实例主要用于项目展示时鼠标hover后显示一个遮罩显示项目详情的效果,遮罩采用CSS的绝对定位以及CSS3盒子模型. 本实例应用广泛,很多品牌官方网站均有采用. hover: <!DOCTYP ...
- 获取相应头信息Response Headers的内容类型Content-Type
Content-Type内容类型,也是键值对的形式: 我们在代码中获取: package com.zhi.httpClient2; import org.apache.http.Header; imp ...
- mysql 开放远程连接权限连不上
1.my.cof配置了:bind-address=addr 或 skip-networking,需要注释 2.防火墙限制3306端口: iptables -L -n --line-numbers ...
- Js DOM 修改 css Style
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...