1、虚拟机类概加载概述java
虚拟机将描述类的Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终造成能够直接被虚拟机使用的Java类型数据结构
Java语言支持动态加载和动态链接。对象
2、虚拟机加载类的具体过程blog
1.类加载总的流程继承
加载-->链接(验证、准备、解析)-->初始化,须要注意的是每一个阶段之间没有彻底清晰的界限,一般是前一个阶段执行到某处,就会触发下接口
个阶段的执行。内存
2.类加载过程当中各步骤的具体任务虚拟机
加载阶段:须要完成3个任务。经过类名得到Class文件(注意:字节码文件的来源能够是任意的);将这个字节码文件表明的静态存储结构转换变量
为方法区的运行时数据结构;在Java堆中生成一个表明该类字节码文件的java.lang.Class文件的对象,该对象做为程序访问方法区数据的入口。扩展
注意:方法区的数据结构由虚拟机本身定义,加载阶段与链接阶段的部分是交叉进行的。
验证:验证是链接的第一步,主要的目的是确保字节码文件中的信息符合虚拟机的要求,而且不会对虚拟机形成伤害。不一样的虚拟机对字节码
文件的验证可能会不一样,主要分为4部分的验证:
文件格式验证:检验字节码文件的格式规范,而且验证是否能被当前版本的虚拟机处理。只有完成这部分验证,字节码文件才能进入方法区,
后面3个部分的验证是基于方法区的验证。
元数据验证:对字节码的描述信息进行语义分析,确保描述信息符合Java语言规范。
字节码验证:是整个验证过程当中最复杂的部分,主要是对数据流和控制流的验证,确保类的方法在运行的时候不会对虚拟机形成危害。
符号引用验证:这个阶段发生在虚拟机将符合引用转换为直接引用的过程当中,这部分发生解析阶段。这个阶段的目的就是确保解析阶段
能够被正常的执行。
准备:目的是对全部的类变量--静态成员变量进行默认初始化。
解析:将虚拟机常量池中的符号引用转换为直接引用的过程。分为4类,类或接口的解析;字段的解析;类方法的解析、接口方法的解析
初始化:执行字节码文件定义的初始化。
3、类与类加载器
类加载器:其实就是一段代码用来实现类的加载,可是须要注意的是使用不一样的类加载器加载,在堆中生成的Class对象是不相等的。
类加载器的分类:启动类加载器(属于JVM的一部分)、扩展类加载器、应用程序类加载器,以及自定义的类加载器。一般应用程序的加载都是由这3种
加载器配合一块儿完成类的加载。
类加载器的双亲委派模型:若是一个类加载器收到了类加载的亲求,先传给其上级的类加载器,看是否被加载过,每一级类加载器都是这样操做
上级类记载器没加载过,本身又不想加载的时候,下级类加载器才开始工做。注意:各级类加载器类之间的关系是组合关系,不是继承。