Java虚拟机(三)
2014-04-03 15:49
190 查看
类加载器子系统
Java虚拟机实现中负责查找和加载类型的部分是类加载器子系统。java虚拟机包含两种类型的类加载器:bootstrap类加载器和user-defined类加载器。bootstrap类加载器是java虚拟机实现的一部分,而user-defind类加载器属于正在运行的java程序的一部分,不同的类加载器加载的classes被放置到各自的名字空间里。user-defined类加载器是java.lang.ClassLoader派生类的对象。ClassLoader类的方法允许java程序访问虚拟机的类加载机制。另外,对于每一个java虚拟机加载的类型,都会创建一个java.lang.Class类的实例来表示那个类型。跟所有的对象一样,user-defined类加载器和Class类实例都是是存储在堆中的。而被加载类型的数据则存储在方法区里。
加载,链接和初始化
类加载器子系统不仅需要负责定位和导入类的二进制数据,它还必须验证导入类的正确性,为类变量分配和初始化内存,和协助解析符号引用。这些活动必须按照严格的顺序执行:1. 加载:查找和导入类型的二进制数据
2. 链接:执行验证,准备和解析(可选择)
a.验证:保证导入类型的正确性b.准备:为类变量分配内存并初始化成默认值
c.解析:将符号引用转化成类型的直接引用
3. 初始化:调用java代码将类变量初始化成正确的初始值
Bootstrap类加载器
java虚拟机实现必须能够识别并加载存储在class文件中的class和interface。每个java虚拟机实现都有一个bootstrap类加载器,它知道如何加载一个可信的类,包括Java API里面的类。给定一个全限定名,bootstrap类加载器必须尝试以某种方式产生定义该类型的数据。java虚拟机实现中的一个常用的方法是,搜索一个用户定义目录的路径,这个路径存储在一个名字为CLASSPATH的环境变量中。bootstrap类加载器按CLASSPATH中的目录顺序搜索每一个目录,知道它找到一个名字匹配的文件(类型的简单名字加".class")。User-Defined类加载器
虽然user-defined类加载器本身是java程序的一部分,但是在ClassLoader类中,有4个方法作为进入java虚拟机的途径。// Four of the methods declared in class java.lang.ClassLoader: protected final Class defineClass(String name, byte data[], int offset, int length); protected final Class defineClass(String name, byte data[], int offset, int length, ProtectionDomain protectionDomain); protected final Class findSystemClass(String name); protected final void resolveClass(Class c);任何的java虚拟机实现都必须注意将ClassLoader类的这些方法与内部的类加载器子系统连接。
名字空间
每个类加载器都维护着自己的名字空间,用于存放它所加载的类型。当虚拟机需要从一个类中解析到另一个类的符号引用时,就会请求引用类的类加载器来加载被引用类。相关文章推荐
- spring配置proxool连接db2
- Java最小二乘法线性回归函数编码实现
- Java字节流和字符流实例
- Java静态方法、单例模式区别
- Java实现list清除重复的字符串
- [Java] 匿名类用法一例 -- FilenameFilter
- sigar 使用报错问题解决(java.lang.UnsatisfiedLinkError: gather)
- struts2的restful
- java实现汉字取拼音首字母--尝试着贴些简洁的对大家可能有用的代码 推荐
- struts2遍历Map
- java中byte数组与int类型的转换(两种方式)
- java中的MessageDigest类
- Spring 的Hibernate事务管理机制 .
- java获取路径
- Java web 项目中文件的下载
- java打印九九乘法表
- java代码注释规范
- LeetCode | Remove Duplicates from Sorted Array
- netbeans常用快捷键(for php)
- Java注释@interface的用法