Java类加载机制

Posted dengjianghua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java类加载机制相关的知识,希望对你有一定的参考价值。

一、JVM类加载机制流程如下

技术图片

 

二、逐步说明各步骤的主要工作

1.JVM加载(读取)二进制字节流到主内存,可从多个途径读取流信息。常见如使用javac HelloWorld.java获得的HelloWorld.class文件、或程序编译后存储在数据库,之后运行时读取、或"牛x"手写class文件内容、Java命令打jar包、mvn打包war等,总而言之,JVM对内容的存储形式不做特别要求,因为不论什么文件类型,最终都会对二进制流内容作校验。加载阶段完成时,字节流存储在方法区中,同时实例化java.lang.Class对象作为该字节流对应的类型的外部接口。

2.内容验证阶段

2.1 文件格式验证

  所谓文件格式验证是指JVM支持的文件格式,JVM通过是否包含特定的内容信息进行验证。

  1.魔数验证:字节流以0xCAFEBABE开头

  2.版本号验证。当前虚拟机是否能够处理当前版本,比如用低版本虚拟机加载高版本虚拟机编译后的class文件,会报错。

  3.常量池验证。常量池数量,常量池内容等

  4.整个文件结构是否完整。Java字节码文件是内容连续的、有序的、格式固定的,因此有任何添加或删除则都会被视为非法

  5.其他验证如文件名、方法名长度、编码等

  文件格式验证通过后,字节流才会被转换为一个Java类型存储在方法区,接下来的验证则是基于方法区中的存储结构进行的

  2.2 元数据验证

    1.父类验证(除java.lang.Object外,其他类都应该有父类)

    2.继承关系(包括Java语义中的继承与实现)验证。比如是否继承了不能继承的类,是否继承了多个具体类,是否实现(implements)了类而非接口等

    3.是否满足类定义验证。比如非抽象类是否完全实现了父接口的所有方法

    4.是否覆盖父类中不允许继承的方法,本类中是否发生错误的重载等

    ...

    该阶段主要是对内容进行语义分析,确保符合Java语言规范要求

  2.3 字节码验证

    简单点说就是对代码中的方法做校验,确保方法在运行时不会危害到自身。

    1.方法中的对象赋值时,类型检查。是否将C类型赋值给其他非C以及非C父类类型,如此将导致类型不匹配异常(受检异常)

    2.操作数栈的类型与指令代码序列一致

    ...

  2.4 符号引用验证

    1.该引用指向的类是否存在

    2.该引用指向的方法,在特定类中是否存在

    3.该引用指向的字段,在特定类中是否存在

    4.该引用指向的类、方法、字段是否具备访问权限

    ...

    主要验证符号引用对应的信息是否能够匹配

 

3.准备阶段,经过第2阶段,认为读入的字节流数据信息合法,

 

以上是关于Java类加载机制的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 类加载机制

Java类加载机制详解

Java 类加载机制

详解JAVA类加载机制

Tomcat类加载机制和JAVA类加载机制的比较

java类加载机制简介---JVM