第四课、类加载器的深入解析与阶段分解

2018-03-19  本文已影响20人  木头amo

类加载器的深入解析与阶段分解

        类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码(将.class文件从磁盘加载到内存),并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象。实际的情况可能更加复杂,比如 Java 字节代码可能是通过工具动态生成的,也可能是通过网络下载的。

类加载总共分为5个阶段分别是:

A、 类的加载

        通过一个类的完全限定查找此类字节码文件[.class文件--- 二进制文件],如果不存在该文件则抛出异常,并将其加载到内存中(例如:将String类、Object类等加载内存),同时利用字节码文件创建一个Class对象。

B、连接

        此阶段是将类与类的关系确定好,符号引用变成直接引用。同时针对字节码进行验证和校验(校验和验证的必要性:因为字节码文件可以利用手工或者工具的方式生成,这些字节码文件可以利用十六进制的工具打开,对文件的内容进行修改编辑,所以存在一些错误和恶意的可能)。在这个连接阶段又细化成三个小阶段,这三个阶段不一定是按照下面顺序严格执行的,它们分别是:

    a、验证:确保被加载类的正确性,字节码文件不被篡改,并且符合JVM的规范。

    b、准备:为类中的静态变量分配内存,并将其初始化对应变量类型的默认值。此阶段把类中的静态变量看成一个全局变量,因为在这个阶段还没有对象存在;根据静态变量的类型分配内存,并赋予该类型的默认值,例如:int分配内存4个字节,并赋予该默认值为0。

    c、解析:把类中的符号引用转换为直接引用。符号引用:间接地引用方式,例如某个类中表示另一个类的符号。直接引用:通过指针直接指向目标内存的位置。

C、初始化

        此阶段是为类中的静态变量赋予正确的初始值。

D、使用

        使用类创建对象,调用其中的方法。

E、卸载

        将内存中类卸载掉,卸载后的类不能再进行使用了。

注意:类的加载、连接、初始化这三个阶段并不是按照这个顺序严格执行,有可能在加载的过程中,出现类的连接处理,具体根JVM的具体实现有关,只要最终的结果按照JVM的规范执行就不会出问题了。前三个阶段比较重要请仔细阅读理解。

例:

class Person {

         publicstatic int a = 1;

}

分析:加载此类的字节码文件到内存;在连接时进行字节码的验证,为其中的成员变量a分配内存空间,将a赋值成对应类型的默认值是0,最后将符号引用变成直接引用;初始化阶段将类中的变量a赋值为1。

类加载器深入剖析

    Java虚拟机与程序的生命周期

    在如下几种情况下,Java虚拟机将结束生命周期

    1、执行了System.exit()方法

    2、程序正常执行结束

    3、程序在执行过程中遇到了异常或异常终止

    4、由于操作系统出现错误而导致Java虚拟机进程终止

参考网址:

深入理解Java类加载器(ClassLoader):http://blog.csdn.net/javazejian/article/details/73413292

OSGI小结:http://blog.csdn.net/zmx729618/article/details/52153755

上一篇下一篇

猜你喜欢

热点阅读