欢迎装载请说明出处: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 loadedClass 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跑一下,有没有发现抛出了异常,来看看这个异常

<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.保护信任类库的边界外,类装载器的第三个重要的作用就是保护域,类装载器必须把代码放入到保护域中以限定这些代码运行时能够执行的操作的权限,这也如我上面讲的,像一个监狱一样,不让它在监狱意外的范围活动。

特别说明:以上部分内容,有参考网上其它作者的精彩提炼,如有冒犯,请见谅,只做学习笔记用途!

转载于:https://www.cnblogs.com/lijia0511/p/4973739.html

java jvm学习笔记二(类装载器的体系结构)相关推荐

  1. Java基础学习笔记(二)_Java核心技术(进阶)

    本篇文章的学习资源来自Java学习视频教程:Java核心技术(进阶)_华东师范大学_中国大学MOOC(慕课) 本篇文章的学习笔记即是对Java核心技术课程的总结,也是对自己学习的总结 文章目录 Jav ...

  2. JVM学习笔记二 :垃圾收集的过程分析Eden-Survivor-Tenured

    内存申请过程 JVM会试图为相关Java对象在Eden中初始化一块内存区域: 当Eden空间足够时,内存申请结束.否则到下一步: JVM试图释放在Eden中所有不活跃的对象(minor collect ...

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

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

  4. JVM 学习笔记二十六、JVM监控及诊断工具-GUI篇

    二十六.JVM监控及诊断工具-GUI篇 1.工具概述 使用上一张命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但他们存在下列局限: (1)无法获取方法级别的分析数据,如方法间的调用关系 ...

  5. JVM 学习笔记二十五、JVM监控及诊断工具-命令行篇

    二十五.JVM监控及诊断工具-命令行篇 1.概述 性能诊断是软件工程师在日常工作中经常面对和解决的问题,在用户体验至上的今天,解决好应用软件的性能问题能带来非常大的收益. Java作为最流行的编程语言 ...

  6. JVM学习笔记二:JVM参数

    所有线程共享的内存主要有两块:堆内存和方法区. 其中堆内存分为两块:新生代Young generation(Eden区.From Survivor区.To Survivor区).老年代Tenured ...

  7. Java脚本学习-笔记二

    jsp中的除了标签script里面的内容外,其他的都是直接输出的,而script里的内容是执行的过程,只是把最终的结果输出. 看如下的例子: 例1输出结果为: var answer='Yes I am ...

  8. wxpython应用程序对象与顶级窗口_wxPython学习笔记(二)

    如何创建和使用一个应用程序对象? 任何wxPython应用程序都需要一个应用程序对象.这个应用程序对象必须是类wx.App或其定制的子类的一个实例.应用程序对象的主要目的是管理幕后的主事件循环. 父类 ...

  9. jvm学习笔记(二)

    jvm学习笔记(二) 文章目录 jvm学习笔记(二) 1.全部笔记链接 2. Native关键字 3.关于JVM规范 3.1 JVM规范中运行时数据区的概念 4.HotSpot的JVM运行时数据区 4 ...

最新文章

  1. python 空数组_【python三级】二维数组的表示
  2. C++ 继承Employee类
  3. linux cmake 安装mysql5.5.11,以及更高版本
  4. selenium+java的常使用的一些操作
  5. HTML页面背景音乐控制
  6. 网络编程—代码—TCP网络传输
  7. 模拟计算器进行四则运算(同等优先级)(内测第2届第3题)
  8. NSMethodSignature, NSInvocation源码分析
  9. [请您去投票]ESRI中国社区2008年度优秀会员评选
  10. Python爬虫实现英汉互译
  11. Java视频特效处理(超全)/PC版美颜相机
  12. BLE(12)—— 细说 Connection
  13. C#如何快速释放内存的大数组详解
  14. matlab 从字符串里面提取出数字
  15. 海康摄像头忘记密码,自己如何快速重置密码
  16. 2019年CSDN排名前10名大神
  17. 手机DIY自制现身南瓜网
  18. 两个必须更新浏览器的理由,危险就在你身边
  19. [完结]saliency filters精读之permutohedral lattice
  20. GAN(生成对抗网络)和IQA(图像质量评价能擦出什么样的火花呢?)简单聊一些近来published的论文

热门文章

  1. PHP生成条形码 之二 开源之道
  2. C# 准备开始学习 并行程序开发
  3. 【干货】裸金属服务Ironic项目介绍
  4. 《PhoneGap精粹:构建跨平台的移动App》——1.10节PhoneGap资源
  5. 【caffe】create_cifar10.sh在windows下解决方案
  6. 向 Web 开发人员推荐35款 JavaScript 图形图表库
  7. Python模块学习——optparse
  8. 【引用】整理Sed与Awk学习笔记(一)
  9. Android Tabhost with FragmentActivity
  10. 敏捷开发签名人建议开发者放弃“敏捷”