java jvm学习笔记二(类装载器的体系结构)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao
在了解java虚拟机的类装载器之前,有一个概念我们是必须先知道的,就是java的沙箱,什么是java的沙箱,java的沙箱总体上经历了这么一个过程,从简单的java1.0的基础沙箱到java1.1的基于签名和认证的沙箱到后来基于基础沙箱+签名认证沙箱的java1.2的细粒度访问控制。
java的沙箱是你可以接受来自任何来源的代码,但沙箱限制了它进行可能破坏系统的任何动作,因为沙箱相对于系统的总的访问能力已经被限制,所以沙箱形象的说更像是一个监狱,把有破坏能力的代码困住了。
java沙箱的基本组件如下:
1.类装载器结构(可以由用户定制)
2.class文件检验器
3.内置的java虚拟机
4.安全管理器(可以由用户定制)
5.java核心API
java的沙箱中类装载器和安全管理器可以由用户定制的,但是这样就加大了java代码安全的风险,所以java有一个叫访问控制体系结构,他包括安全策略规范和运行时安全策略实施,java有一个默认的安全策略管理器,用户可以使用默认的安全策略管理器也可以在它之上进行扩展。
java类装载器的体系结构
java的类装载器从三方面对java的沙箱起作用:
1.它防止恶意的代码区干扰善意的代码
怎么理解这句话,不同的类装载器装入同样的类的时候会产生一个唯一的命名空间,java虚拟机维护着这些命名空间,同一类,一个命名空间只能装载一次,也只会装载一次,不同命名空间之间的类就如同各自有一个防护罩,感觉不到彼此的存在,如下图3-1所示

2.它守护了被信任的类库边界
这里有两个需要理解的概念,一,双亲委托模式,二运行时包,java虚拟机通过这两个方面来界定类库的边界
什么是双亲委托模式
先来看一个图和一段代码

这个图说明了类装载的过程,但是光这么看还是没有那么的清晰,我们只知道虚拟机启动的时候会启动bootStrapClassLoader,它负责加载java的核心API,然后bootStrapClassLoader会装载
Launcher.java 之中的 ExtClassLoader(扩展类装载器),并设定其 Parent 为 null ,代表其父加载器为 BootstrapLoaderExtClassLoader再有ExtClassLoader去装载ext下的拓展类库,然后 Bootstrap Loader 再要求加载 Launcher.java 之中的 AppClassLoader(用户自定义类装载器) ,并设定其 Parent 为之前产生的 ExtClassLoader 实体。这两个加载器都是以静态类的形式存在的,下面我们找到java.lang.ClassLoader的loadClass这个方法
<span style="font-size:14px;">protected synchronized Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
// First, check if the class has already been loaded
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}</span>
这个方法告诉我们双亲委托模式的过程,当虚拟机去装载一个类的时候会先调用一个叫loadClass的方法,接着在这个方法里它会先调用findLoadedClass来判断要装载的类字节码是否已经转入了内存,如果没有的话,它会找到它的parent(这里的parent指装载自己的那个类加载器,一般我们的应用程序类的parent是AppClassLoader),然后调用parent的loadClass,重复自己loadClass的过程,如果parent没有装载过着这个类,就调用findBootstrapClass(这里是指bootStrap,启动装载器)来尝试装载这个类的字节码,如果bootStrap也没有办法装载这个类,则调用自己的findClass来尝试装载这个类,如果还是没办法装载则抛出异常。
上面就是对双亲模式的简单描述,那么双亲委托描述有什么好处?
你尝试一下自己写个java.lang.String的类,然后在ecplise跑一下,有没有发现抛出了异常,来看看这个异常
运行这个我们自己定义的类的java.lang.String的双亲委托模式加载过程如下AppClassLoader -> ExtClassLoader -> BootstrapLoader,由于BootstrapLoader只会加载核心API里的类,它匹配到核心API(JAVA_HOME\jre\lib)里的String类,所以它以为找到了这个类就直接去寻找核心API里的String类里的main函数,所以就抛出异常了,而我们自己写的那个String根本就没有机会被加载入内存,这就防止了我们自己写的类对java核心代码的破坏。
什么是运行时包
要了解运行时包,我们先来设想一个问题,如果你自己定义了一个java.lang.A的类,能不能访问到java.lang.String类的friend成员?
不行,为什么?这就是运行时包在起作用,java的语法规定,包访问权限的成员能够被同一个包下的类访问,那是为什么不能够访问呢,这同样是为了防止病毒代码的破坏,java虚拟机只允许由同一个类装载器装载到同一包中的类型互相访问,而由同一类装载器装载,属于同一个包的,多个类型的集合就是我们所指的运行时包了。
3.将代码归入某类(保护域),该类确定了代码能够执行那些操作
除了1.屏蔽不同的命名空间,2.保护信任类库的边界外,类装载器的第三个重要的作用就是保护域,类装载器必须把代码放入到保护域中以限定这些代码运行时能够执行的操作的权限,这也如我上面讲的,像一个监狱一样,不让它在监狱意外的范围活动。
特别说明:以上部分内容,有参考网上其它作者的精彩提炼,如有冒犯,请见谅,只做学习笔记用途!
java jvm学习笔记二(类装载器的体系结构)的更多相关文章
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer
作者:Grey 原文地址:Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer ByteBuffer.allocate()与ByteBuffer.allocateD ...
- Java IO学习笔记二
Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...
- java jvm学习笔记十一(访问控制器)
欢迎装载请说明出处: http://blog.csdn.net/yfqnihao/article/details/8271665 这一节,我们要学习的是访问控制器,在阅读本节之前,如果没有前面几节的 ...
- java jvm学习笔记七(jar包的代码认证和签名)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前言: 如果你循序渐进的看到这里,那么说明你的毅力提高了,jvm的很多东西都是比较抽像的,如果不找相对应的代码来辅助理解 ...
- java jvm学习笔记十三(jvm基本结构)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完 ...
- Java设计模式学习笔记(二) 简单工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...
- java jvm学习笔记十二(访问控制器的栈校验机制)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...
- java jvm学习笔记五(实践自己写的类装载器)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和 ...
随机推荐
- (转载)Unity3d摄像机Camera参数详解
1. Clear Flags:清除标记.决定屏幕的哪部分将被清除.一般用户使用对台摄像机来描绘不同游戏对象的情况,有3中模式选择: Skybox:天空盒.默认模式.在屏幕中的空白部分将显示当前摄像机的 ...
- 【BZOJ3196】Tyvj 1730 二逼平衡树
Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的 ...
- bnuoj 29373 Key Logger(模拟双向队列)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=29373 [题意]:模拟光标输入 [题解]:用双向列表模拟实现,这里用其他模拟会超时,注意内存的释放 ...
- bnu 4353 删格游戏(博弈)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=4353 [题意]:每次选择一个小格后,该小格的右上部分就全被删去了,且要求每次至少删去一个格子,选中左 ...
- 通过注册表查找oracle_home的位置
运行regedit进入注册表 ctrl+f查找oracle_home
- 有关js的变量、作用域和内存问题
来自<javascript高级程序设计 第三版:作者Nicholas C. Zakas>的学习笔记(四) js共有5种基本数据类型:Undefined.NULL.Boolean.Numbe ...
- datagridview 右键选中行 并弹出菜单
private void dataGridView_OLUsers_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) { i ...
- uva 1103
弄懂题意后 其实就是一个dfs /************************************************************************* > Aut ...
- Oracle 学习笔记(一)
1.连接数据库命令: conn 用户名/密码,当用特权身份连接时,要加上as sysdba 2.修改密码: passw(ord),如果要修改其他人的密码,需要用sys或者system登录 3.显示当前 ...
- Android UI-开源框架ImageLoader的完美例子
Android开源框架ImageLoader的完美例子 2013年8月19日开源框架之Universal_Image_Loader学习 很多人都在讨论如何让图片能在异步加载更加流畅,可以显示大量图片, ...