类加载机制

最近在学习《深入理解jvm》以及张龙老师的《java虚拟机系列视频》,将这些东西记录下来,以供后面回忆。

 

  JVM把class文件加载的内存,并对数据进行校验、转换解析和初始化,最终形成JVM可以直接使用的Java类型的过程就是加载机制。

类从被加载到虚拟机内存中开始,到卸载出内存为止,它的生命周期包括了:加载(Loading)、验证(Verification)、准备 (Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading) 七个阶段,其中验证、准备、解析三个部分统称链接。

  加载(装载)、验证、准备、初始化和卸载这五个阶段顺序是固定的,类的加载过程必须按照这种顺序开始,而解析阶段不一定;它在某些情况下可以在初始化之后 再开始,这是为了运行时动态绑定特性。值得注意的是:这些阶段通常都是互相交叉的混合式进行的,通常会在一个阶段执行的过程中调用或激活另外一个阶段。

  一个类被JVM使用时,必须预先经历如上图所述的加载过程。那么什么样的条件才会触发上述过程的执行呢?JAVA程序使用类分为主动使用和被动使用,在JVM的实现规范中要求,所有类的“主动使用“虚拟机才执行上述过程初始化相应的类,那么问题就归结为“主动使用”的意义。 

1.创建类的实例。Object A = new ClassA(); 

2.访问某个类或接口的静态变量或对静态变量赋值;

3.调用类的静态方法;

4.使用反射机制;

5.初始化一个类的子类时,父类也被主动使用;

6.启动类.

 

  类的加载指的是将类的.class文件中的二进制手读入到内存中,将其放在运行时数据区的方法区内,然后再堆区创建一个java.lang.Class对象,用来封装类在方法去内的数据结构。

  加载.class文件的方式:

  从本地系统中直接加载;

  通过网络下载;

  从zip,jar等文档文件中加载;

  从专有数据库提取;

  将java源文件动态编译。

 

  类被加载后,就进入连接阶段。连接就是讲已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去。

  

  类的验证的内容

  类文件的结构检查;

  语义检查;

  字节码验证;

  二进制兼容性验证。

 

  类的初始化步骤:

  (1)假如这个类还没有被加载和连接,那就先进行加载和连击。

  (2)假如类存在直接的父类,并且这个父类还没有被初始化,那就先初始化直接的父类。

  (3)假如类中存在初始化语句,那就一次执行这些初始化语句。

posted @ 2014-01-04 15:54  shisw  阅读(865)  评论(0编辑  收藏  举报