Java虚拟机类加载机制--概述

一、虚拟机类概加载概述

  虚拟机将描述类的Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以直接被虚拟机使用的Java类型

Java语言支持动态加载和动态连接。

二、虚拟机加载类的具体过程

  1.类加载总的流程

  加载-->连接(验证、准备、解析)-->初始化,需要注意的是每个阶段之间没有完全清晰的界限,通常是前一个阶段执行到某处,就会触发下

个阶段的执行。

  2.类加载过程中各步骤的具体任务

  加载阶段:需要完成3个任务。通过类名获得Class文件(注意:字节码文件的来源可以是任意的);将这个字节码文件代表的静态存储结构转换

为方法区的运行时数据结构;在Java堆中生成一个代表该类字节码文件的java.lang.Class文件的对象,该对象作为程序访问方法区数据的入口。

注意:方法区的数据结构由虚拟机自己定义,加载阶段与连接阶段的部分是交叉进行的。

  验证:验证是连接的第一步,主要的目的是确保字节码文件中的信息符合虚拟机的要求,并且不会对虚拟机造成伤害。不同的虚拟机对字节码

文件的验证可能会不同,主要分为4部分的验证:

  文件格式验证:检验字节码文件的格式规范,并且验证是否能被当前版本的虚拟机处理。只有完成这部分验证,字节码文件才能进入方法区,

后面3个部分的验证是基于方法区的验证。

  元数据验证:对字节码的描述信息进行语义分析,确保描述信息符合Java语言规范。

  字节码验证:是整个验证过程中最复杂的部分,主要是对数据流和控制流的验证,确保类的方法在运行的时候不会对虚拟机造成危害。

  符号引用验证:这个阶段发生在虚拟机将符合引用转换为直接引用的过程中,这部分发生解析阶段。这个阶段的目的就是确保解析阶段

可以被正常的执行。

  准备:目的是对所有的类变量--静态成员变量进行默认初始化。

  解析:将虚拟机常量池中的符号引用转换为直接引用的过程。分为4类,类或接口的解析;字段的解析;类方法的解析、接口方法的解析

  初始化:执行字节码文件定义的初始化。

三、类与类加载器

  类加载器:其实就是一段代码用来实现类的加载,但是需要注意的是使用不同的类加载器加载,在堆中生成的Class对象是不相等的。

  类加载器的分类:启动类加载器(属于JVM的一部分)、扩展类加载器、应用程序类加载器,以及自定义的类加载器。通常应用程序的加载都是由这3种

  加载器配合一起完成类的加载。

  类加载器的双亲委派模型:如果一个类加载器收到了类加载的亲求,先传给其上级的类加载器,看是否被加载过,每一级类加载器都是这样操作

  上级类记载器没加载过,自己又不想加载的时候,下级类加载器才开始工作。注意:各级类加载器类之间的关系是组合关系,不是继承。

  

posted @ 2017-11-11 15:19  sun1993  阅读(874)  评论(0编辑  收藏  举报