虚拟机类加载机制之类的加载过程

Posted BINGJJFLY

tags:

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

引言

  类加载的全过程分为5个阶段:加载,验证,准备,解析,初始化。

加载

  加载阶段虚拟机需要完成3件事:

  1)通过一个类的全限定名来获取定义此类的二进制字节流,获取方式很多种如Class文件、网络、运行时计算生成等。

  2)将这个字节流代表的静态存储结构转化为方法区的运行时数据结构。

  3)在内存中生成一个代表该类的java.lang.Class对象放在方法区,作为该类各种数据的访问入口。

  一个非数组类的加载可以由引导类加载器完成也可以由用户自定义的类加载器完成。对于数组类而言,数组本身不通过类加载器创建,是虚拟机直接完成。

  一个数组的创建遵循如下规则:

    如果数组的组件类型(去掉一个维度)为引用类型,递归加载该引用类型,数组将在加载该组件类型的类加载器的类命名空间上被标记。

    如果数组的组件类型不是引用类型(如int[]),虚拟机将会把数组与引导类加载器相关联。

    数组的可见性与其组件的可见性一致,如果数组的组件类型不是引用类型(如int[])默认可见性为public。

验证

  验证是连接的第1步,作用是保证Class文件的字节流中包含的信息符合虚拟机的要求。

文件格式验证

  验证字节流信息是否符合Class文件格式规范。

  1)是否以魔数开头。

  2)主次版本号是否在当前虚拟机处理范围之内。

  3)常量池中的常量类型是否被支持(检查常量tag标识)。

  。。。。。。

  只有通过了该阶段的验证,字节流才能进入方法区中进行存储。该阶段是针对字节流,后三个阶段是针对方法区的存储结构的。

元数据验证

  对字节码描述的信息进行语义分析,保证 其描述的信息符合Java语言规范。

  1)该类是否有父类(除Object其他类都应有)。 

  2)该类父类是否继承了不能被继承的类(final修饰的类)。

  。。。。。。

字节码验证

  该阶段是对方法体进行校验分析,确保方法运行时不会危害虚拟机。

   1)保证任意时刻操作数栈的数据类型和指令代码序列配合工作,如不允许在操作数栈放了一个int类型数据,运行时却按long类型加载到局部变量表中。

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

虚拟机类加载机制——类加载器

Jvm(52),虚拟机类加载机制----类加载的过程----加载

虚拟机类加载机制

虚拟机类加载机制------类加载的过程

深度分析:Java虚拟机类加载机制过程与类加载器

深度分析:Java虚拟机类加载机制过程与类加载器