代码改变世界JVMJVM · Java虚拟机原理 · JVM上语言·框架· 生态系统

JVM系列之类的验证

2021-03-29  本文已影响0人  简楼

一、前言

类的加载完成后,就是验证;
保加载进来的字节流符合JVM规范

二、验证三问

    1)什么是验证?
   验证.class是否符合JVM规范,包括语义、语法以及逻辑是否合规。

    2)为什么验证?
    保证JVM对class的正常识别,保证虚拟机的正常运行;

    3)怎么验证?
        i. 文件格式验证:验证.class文件字节流是否符合class文件的格式的规范,并且能够被当前版本的虚拟机处理。这里主要被魔数、主版本号、常量池等等的校验

        ii. 元数据验证:验证是否符合java语言规范,主要是对字节码描述的信息进行语义分析,以保证其描述的信息符合java语言规范的要求,比如说验证这个类是不是有父类,类中的字段方法是不是和父类冲突等等

        iii. 字节码验证:确保程序语义合法,符合逻辑,是整个验证过程最复杂的阶段。主要是通过数据流和控制流分析,确保程序语义是合法的、符合逻辑。在元数据验证那个阶段对数据类型做出验证后,这个阶段主要对类的方法做出分析,保证类的方法在运行时不会做出危害虚拟机安全的事

        iv. 符号引用验证:确保下一步的解析能正常执行,它是验证的最后一个阶段,发生在虚拟机将符号引用转化为直接引用的时候。主要是对类自身以外的信息进行校验。目的是确保解析动作能够完成

三、非必须的验证

    对整个类加载而言,验证阶段是一个很重要但又非必需的阶段;
如果能够确保代码没有问题,那就没有必要去验证,因为校验是也是需要花费时间的。
所以我们可以使用 -Xverfity:none 来关闭大部分的验证。

上一篇下一篇

猜你喜欢

热点阅读