JVM学习笔记五 :虚拟机类加载器

来源:互联网 发布:百度seo关键词排名 编辑:程序博客网 时间:2024/06/05 16:21
虚拟机的类加载机制:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换 解析和初始化,最终形成可以被虚拟机直接使用的Java类型。

一、类加载过程:
1、加载
    什么时候加载?
        虚拟机中并没有进行强制约束,这点可以交给虚拟机的具体实现自由把握。
    加载做了什么?(需要完成三件事)
        1)通过一个类的全限定名来获取定义此类的二进制字节流。(获取二进制字节流并不是必须从Class文件中获取,可以ZIP包中读取(JAR)等)
        2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。(方法区中的数据存储格式由虚拟机自行定义)
        3)在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口。
2、链接
    什么时候链接?
        在加载完成之后。
    链接做了什么?(分为三个部分)
        2.1验证(分为四个阶段)
            目的:是为了确保Class文件的字节流中包含的信息是符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
                (1)第一阶段:文件格式验证
                       目的: 验证字节流是否符合Class文件的规范,并且能被当前版本的虚拟机处理。
                       
                (2)第二阶段:元数据验证
                        目的:对类的元数据进行语义校验,保证不存在不符合Java语言规范的元数据信息。
                       
                (3)第三阶段:字节码验证(进行数据流和控制流的分析)
                        目的:保证被校验类的方法在运行时不会做出危害虚拟机安全的行为。
                       
                       
                       
                   (4)第四阶段:符号引用验证
                        目的:对类自己以外(常量池的各种符号引用)的信息进行匹配性的校验。
                        发生时间:虚拟机将符号引用转换为直接引用的时候。
    2.2准备
             目的:准备阶段是正式为类变量分配内存并设置类变量初始值的阶段。这里的初始值是指数据类型的零值。如果变量被final所修饰,那就直接赋值。
    2.3解析(分为四种解析)
           目的:解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。
           符号引用:符号引用用一组符号来描述引用的目标。例如Class文件中的CONSTANT_Class_info、CONSTANT_Fieldref_info等类型的常量。
           直接引用:直接指向目标的指针、相对偏移量或是一个间接定位到目标的句柄。
        (1)类或接口的解析——返回类的全限定名
               
    (2)字段解析——返回字段的简单名称以及字段所在类的全限定名
               
               
        (3)类方法解析——返回类方法的全限定名
                   
        (4)接口方法解析——返回接口方法的全限定名
                   
3、初始化
    什么时候初始化?
       
    初始化做了什么?   
        到了初始化阶段才真正开始执行类中定义的Java程序代码(或者说是字节码),初始化变量和其他资源。初始化阶段是执行类构造器<clinit>()方法的过程。
4、使用
5、卸载

二、类加载器
类与类加载器:对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性。
双亲委派模型提供的类加载器:启动类加载器、 扩展类加载器、应用程序类加载器(系统类加载器)
双亲委派模型的工作流程:如果一个类加载器收到了类加载的请求,他首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都是应该传送到顶层的类加载器中,只有当父加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。
线程上下文类加载器:就是富类加载器请求子类加载器去完成类加载的动作,这种行为实际上就是打通了双亲委派模型的层次结构来逆向使用类加载器。

0 0