2016/3/18复习(类加载机制)
1、类的生命周期:
加载、验证、准备、解析、初始化、使用、卸载;其中验证、准备、解析过程称为连接,解析过程不一定在初始化过程之前,因为java语言是运行时绑定。
2、类的加载(重点)
类的加载过程可以是用户参与度较高的过程;
类的加载过程主要做三件事:通过一个类的全限定名来获取此类的二进制字节流;将二进制字节流转化为方法区中运行时的数据结构;构造Class类型,存储在方法区中,作为该类中数据的访问入口。
类加载器:实现第一个过程,所采用的代码模块,称为类加载器。每一个类加载器,都拥有一个独立的类名称空间,比较两个类是否“相等”的前提是两个类是由同一个类加载器加载的。
3、双亲委派模型(重点)
类的加载器大致分为两类,一类是启动类加载器,由C++语言实现,它是虚拟机自身的一部分;另一类是其他类型的加载器,由java语言实现,独立于虚拟机外部,并且都继承自抽象类java.lang.ClassLoader。
如果细分的话,绝大多数的java程序会用到以下三种加载器:启动类加载器,扩展类加载器,应用程序类加载器。
启动类加载器:这个类加载器负责将存放在\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的类库加载到虚拟机内存中。启动类加载器无法被java程序直接引用。
扩展类加载器:它负责加载\lib\ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。
应用程序类加载器:由于这个类加载器是ClassLoader中的getSystemClassLoader方法的返回值,所以一般也称它为系统类加载器。它负责加载用户类路径(ClassPath)上所指定的类库。
双亲委派机制:如果一个类加载器收到了类加载的请求,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
双亲委派机制的第一个优点是java类随着它的类加载器一起具备了一种带有优先级的层次关系;其次,类的加载过程中,重复的类不会加载第二个。
4、验证
验证阶段是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
验证主要包括四个阶段:文件格式验证、元数据验证、字节码验证和符号引用验证。其中文件格式验证是基于二进制字节流进行的,其他三阶段是基于方法区的存储结构进行的。
5、准备
6、解析
待续