jvm|Java:了解JVM加载、JVM链接和JVM初始化( 二 )


因此 , 简而言之 , 加载过程基本上完成了这三个功能:
从类文件创建二进制数据流
根据内部数据结构解析二进制数据
创建 java.lang.Class 的实例

链接过程
根据 Java 8 虚拟机规范 , 它是获取类或接口并将其组合到 JVM 的运行时状态以便可以执行的过程 。
链接从类的验证过程开始 , 确保它符合语言的语义并且不会破坏 JVM 的完整性 。 但是 , JVM 规范说明了验证过程 , 但为特定于供应商的 JVM 实现者提供了灵活性 , 以决定何时应该进行链接活动或如何验证类型 。
JVM 指定了在特定情况下要抛出的异常列表 。 在这方面 , 值得一提的是 , 从二进制数据被解析到内部数据结构的一开始 , 就有一点点的检查和验证 , 这个过程中的检查确保了操作不会崩溃 。 此外 , 还进行检查以确保二进制数据的结构与其预期的格式一致 。 加载器还检查一个类是否是 java.lang.Object 的子类 , 唯一的例外是 Object 类本身 。 这通常需要递归加载超类层次结构 。 以这种方式 , 在多个阶段进行大量验证 , 但通常认为正式验证从链接开始 。
验证完成后 , JVM 为类变量分配内存 , 并根据变量的类型将它们初始化为默认值 。 然而 , 实际初始化(使用用户定义的初始化值)直到下一个初始化阶段才会发生 。 这个过程称为准备 。
最后 , 在可选的解析阶段 , JVM 定位常量池(符号表)中引用的类、接口、字段和方法 , 并从它们的符号引用中确定具体值 。 Java 符号引用解析同样对特定于供应商的实现开放 。 它可能决定在使用时解析类或接口中的符号引用 , 或者在验证过程中解析它们 。 简而言之 , 验证检查类的二进制表示在结构上是否正确 。 并且 , 它可能确保它可能必须加载其他类(可能)而无需验证这些类(如果这些类是 Java API 库的一部分) 。
因此 , 简而言之 , 链接过程涉及三个功能:
确认
准备
分辨率(可选)

初始化过程
根据 Java 8 虚拟机规范 , 类或接口的初始化包括执行其类或接口的初始化方法 。
在通过验证、准备和可选解析过程链接类或接口之后 , 初始化阶段使类准备好进行第一次活动使用 。 该过程从使用程序预期开始的值初始化类变量开始 。 程序员有责任根据自己的宏伟计划决定类变量的适当值 。 因此 , 初始化意味着类变量通过程序员描述的一些初始化例程进行初始化 , 并在类的直接超类尚未初始化的情况下对其进行初始化 。 然而 , 接口的初始化不需要初始化它的超接口 。 这是一个接口的例外 。
因此 , 概括起来 , 初始化过程涉及以下两个功能:
用程序员指定的例程初始化类变量 。
如果尚未初始化 , 则初始化其超类 。
结论
这是对 JVM 中加载、链接和初始化过程的简要概述 , 每个阶段都涉及许多更精细的复杂性 , 并且为了保持简单和简洁而被忽略了 。