java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种,

第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新的解析一次,

第二种,即时解析,也就是转载到内存的字节码会被解析成本地机器码,并缓存起来以提高重用性,但是比较耗内存,

第三种,自适应优化解析,即将java将使用最贫乏的代码编译成本地机器码,而使用不贫乏的则保持字节码不变,一个自适应的优化器可以使得java虚拟机在80%-90%的时间里执行优化过的本地代码,而只需要执行10%-20%对性能有影响的代码。

第四种,一种能够利用本地方法直接解析java字节码的芯片。

java之jvm学习笔记二(类装载器的体系结构)

在了解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这个方法

  1. <span style="font-size:14px;">protected synchronized Class<?> loadClass(String name, boolean resolve)
  2. throws ClassNotFoundException
  3. {
  4. // First, check if the class has already been loaded
  5. Class c = findLoadedClass(name);
  6. if (c == null) {
  7. try {
  8. if (parent != null) {
  9. c = parent.loadClass(name, false);
  10. } else {
  11. c = findBootstrapClass0(name);
  12. }
  13. } catch (ClassNotFoundException e) {
  14. // If still not found, then invoke findClass in order
  15. // to find the class.
  16. c = findClass(name);
  17. }
  18. }
  19. if (resolve) {
  20. resolveClass(c);
  21. }
  22. return c;
  23. }</span>

这个方法告诉我们双亲委托模式的过程,当虚拟机去装载一个类的时候会先调用一个叫
loadClass的方法,接着在这个方法里它会先调用findLoadedClass来判断要装载的类字节码是否已经转入了内存,如果没有的话,它会找
到它的parent(这里的parent指装载自己的那个类加载器,一般我们的应用程序类的parent是AppClassLoader),然后调用
parent的loadClass,重复自己loadClass的过程,如果parent没有装载过着这个类,就调用
findBootstrapClass(这里是指bootStrap,启动装载器)来尝试装载这个类的字节码,如果bootStrap也没有办法装载这个
类,则调用自己的findClass来尝试装载这个类,如果还是没办法装载则抛出异常。

上面就是对双亲模式的简单描述,那么双亲委托描述有什么好处?

你尝试一下自己写个java.lang.String的类,然后在ecplise跑一下,有没有发现抛出了异常,来看看这个异常

  1. <span style="font-size:14px;">java.lang.NoSuchMethodError: main</span>

运行这个我们自己定义的类的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学习笔记二(类装载器的体系结构)的更多相关文章

  1. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  2. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  3. java之jvm学习笔记十三(jvm基本结构)

    java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...

  4. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  5. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  6. java jvm学习笔记二(类装载器的体系结构)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao                 在了解java虚拟机的类装载器之前,有一个概念我们是必须先知道的,就是java的沙箱,什 ...

  7. JVM学习笔记(二):垃圾收集

    程序计数器. 虚拟机栈. 本地方法栈3个区域随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作. 每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这 ...

  8. java虚拟机JVM学习笔记-基础知识

    最近使用开发的过程中出现了一个小问题,顺便记录一下原因和方法--java虚拟机 媒介:JVM是每一位从事Java开发工程师必须翻越的一座大山! JVM(Java Virtual Machine)JRE ...

  9. jvm学习笔记二(减少GC开销的建议)

    一:触发主GC(Garbage Collector)的条件 JVM进行次GC的频率很高,但因为这种GC占用时间极短,所以对系统产生的影响不大.更值得关注的是主GC的触发条件,因为它对系统影响很明显.总 ...

随机推荐

  1. [置顶] 自娱自乐7之Linux UDC驱动2(自编udc驱动,现完成枚举过程,从驱动代码分析枚举过程)

    花了半个月,才搞定驱动中的枚举部分,现在说linux的枚举,windows可能有差别. 代码我会贴在后面,现在只是实现枚举,你可能对代码不感兴趣,我就不分析代码了,你可以看看 在<自娱自乐1&g ...

  2. 一步一步重写 CodeIgniter 框架 -- 原因和思路

    CodeIgniter 是一个非常轻量级的 PHP 框架,说是轻量级,最新版的代码只有不到2M. 其最重要的特点就是 MVC 模式来编写代码,如果大家看过一些用 PHP 来编写网站的书籍或教程,无一例 ...

  3. CSS实现强制换行-------Day 78

    事实上最早的时候也考虑过这个问题,当时还在想须要判定文字的长度么,实在是傻到极点了,原来CSS中本来就有这个样式设置的.而今天正好看到了有这么一篇介绍.细致看了下,感觉还不错,这里也把实验的结果记录下 ...

  4. EasyUI - DateBox组件

    效果: html代码: <input type ="text" id ="box" /> JS代码: $(function () { //设置返回格 ...

  5. 将Qt 动态链接生成的exe及依赖dll打包方法

    源地址:http://blog.csdn.net/ztz0223/article/details/8939341 将Qt 动态链接生成的exe及依赖dll打包方法 原文:http://www.qtcn ...

  6. oracle flashback 2

    Flashback  database      After oracle 10g, oracle can rollback to an prior time by flashback databas ...

  7. Kendo UI开发教程(22): Kendo MVVM 数据绑定(十一) Value

    Value绑定可以把ViewModel的某个属性绑定到DOM元素或某个UI组件的Value属性.当用户修改DOM元素或UI组件的值时,绑定的ViewModel的值也随之发生改名.同样,如果ViewMo ...

  8. Android 带你从源码的角度解析Scroller的滚动实现原理

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273),请尊重他人的辛勤劳动成果,谢谢! 今天给大 ...

  9. 解决android应用程序适用新老android系统版本方法

    老的android系统不能运行高版本系统的新方法,为了解决这个问题:  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { ...

  10. Python Unittest 自动化单元测试框架Demo

    python 测试框架(本文只涉及 PyUnit) https://wiki.python.org/moin/PythonTestingToolsTaxonomy 环境准备 首先确定已经安装有Pyth ...