当前位置: 首页 > 图灵资讯 > 技术篇> 【图灵干货】类加载的几个过程

【图灵干货】类加载的几个过程

来源:图灵教育
时间:2021-12-26 14:37:53

  Java虚拟机会屏蔽与特定操作系统平台有关的信息,这会促使Java程序在Java虚拟机上运行,而不需要修改。本文是针对虚拟机中的类加载过程:装载,验证,准备,解析,初始化五个过程来为大家分析。

类加载的几个过程

  加载

  在装入阶段,将把class文件读到内存中,然后创建一个java.lang.class对象。此流程虚拟机主要完成三项工作:

  1.根据类的全限名称获得定义此类的二进制字节流

  2.将此字节流表示的静态存储结构转换成方法区域的运行时数据结构

  3.在Java堆中生成代表该类的java.lang.Class对象,以访问方法区域数据。

  验证

  在链接的第一步中,验证阶段确保Class文件的字节流包含符合JVM规范的信息,并且不会对JVM造成危害。如果验证失败,则抛出一个java.lang.VerifyError异常或者它的子类异常。确认过程分四个阶段。

  1.文件格式化验证:验证字节流文件是否符合Class文件格式规范,当前虚拟机可以正确地处理它。

  2.Metadata验证:是对字节码所述信息进行语义分析,以确保所描述的信息符合Java语言的规格。

  3.字节码验证:主要分析数据流和控制流,确保校验类的方法在运行时不会危及虚拟机。

  4.符号引用验证:当虚拟机将符号引用转换成直接引用时,就会在解析阶段进行此转换操作。

  准备

  预备阶段分配变量的内存,并设置类变量的初始化。这一阶段分配的只是类的变量(static修改过的变量),没有包含类的实例变量。对于非final变量,JVM会将该变量设置为“零值”,而非其赋值语句的值:

  pirvatestaticintsize=12;

  因此,size的值是0,而不是12。final修饰过的类变量会被赋为真正的值。

  解析

  分析过程是将常量池中的符号引用替换为直接引用。首先分析四类引用类型。解析类或接口,字段解析,方法解析,接口方法解析。

  初始化

  在预备阶段,类变量一次就被初始化了,在这一阶段,就是根据程序开发的程序来初始化类的变量和其它资源。这是static{}块、构造函数、父类的初始化等等。

  对于使用阶段和卸载阶段,这里不再多说了,使用过程是按照程序定义的行为来执行,由GC进行卸载。

  使用

  新线程---程序计数器----jvm栈执行(对象参考)-----堆内存(直接参考)----方法区域。

  卸载

  GC垃圾回收。

  双重委托机制,意义,方法。

  机制

  引导(Bootstrap)类加载程序---->系统(System)类加载程序---->系统(System)类加载器---->上下文(Custom)类加载程序从左到右加载:首先将加载任务委派给父类加载器,按顺序递归,如果父类装入程序能够完成类装入任务,则返回成功;只有父类装入程序不能完成,只是自己去装。

  意义

  避免相同的字节码在内存中出现。

  有了代理机制,就会递归地向父类查找,如果类A被类B引用,Java虚拟机会使用装入类A的类装入程序来装入类B,如果A装入程序已经装入类A,那么B用A的类装入器装入B,就不会装入类A。

  方法

  引导(Bootstrap)类装入程序。

  标准件(Extension)类装入程序。

  Application类装入器(Application)

  内容(Custom)类装入器。

  Java程序设计语言,是目前国内应用最多的编程语言之一。这里面包含了很多知识要点。JVM虚拟机是一种抽象的机器,它可以运行所有java程序,也可以运行Java语言。若要进行java相关的开发工作。确保完全掌握JVM虚拟机技术。