当前位置: 首页 > 面试题库 >

字节码如何在JVM中得到验证?

邵奇
2023-03-14
问题内容

字节码如何在JVM中得到验证?


问题答案:

甲骨文本身有它如何工作的一个小片段页面在这里。

基本上,JRE不信任JDK。那是因为它不知道哪个JDK编译器创建了类文件。它将类文件视为恶意文件,直到通过验证。

对此进行扩展,字节码验证是防止Sun称为“恶意编译器”的必要步骤。Sun自己的Java编译器可确保Java源代码不违反安全规则,但是,当应用程序导入代码片段时,它实际上并不
知道 该代码片段是否遵循Java语言规则来确保安全。换句话说,该代码可能不是由可信赖的Java编译器生成的。

在这种情况下,您计算机上的Java运行时系统必须假定该片段是错误的,并对其进行字节码验证。

在经过验证过程之前,Java虚拟机甚至 看不到
字节码。在加载字节码时执行此操作还具有以下优点:不需要在每次执行代码时都执行很多运行时检查。因为已被验证为正确,所以它一旦开始运行,就可以比其他方式更快地运行。

链接图的呈现形式如下:

                    <<<=== Unsafe / Safe ===>>>
                                  \
+---------------+        +-------------------+
|  Java source  |   +--> |   Class loader    | --+
+---------------+   |    | Bytecode verifier |   |
        |           |    +-------------------+   |
        V           |             /              |
+---------------+   |             \              V
| Java compiler |  Network        /    +-------------------+
+---------------+   |             \    |      JVM/JIT      |
        |           |             /    +-------------------+
        V           |             \              |
+---------------+   |             /              V
| Java bytecode | --+             \    +-------------------+
+---------------+                 /    | Operating system  |
                                  \    +-------------------+
                                  /              |
                                  \              V
                                  /    +-------------------+
                                  \    |     Hardware      |
                                  /    +-------------------+
                                  \
                    <<<=== Unsafe / Safe ===>>>


 类似资料:
  • 问题内容: 有人可以列出字节码验证程序必须执行以确保程序正确性的主要任务吗?JVM规范中是否定义了一组标准的,最少的职责?我还想知道验证是否跨越其他阶段,例如加载和初始化。 问题答案: 这在JVM规范:第4.10章中指定。验证类文件。 该页面的大部分内容描述了类型安全的各个方面。为了检查程序是否是类型安全的,验证程序需要确定每个程序点在操作数堆栈中驻留哪些类型的操作数,并确保它们与相应指令期望的类

  • 我正在与Kotlin和Dagger 2开发一个Android项目。我有一个,它应该提供一个改造的单一实例。我在其中定义了所有这些提供程序函数。 以下所有代码段都在中: 正如您在我的build.gradle中所看到的,我已经声明了构建目标是JVM1.8。为什么我还是会犯这个错误?

  • 问题内容: 我多次听到Java妨碍JIT(即时)编译的情况,其可跨平台移植的字节码被JVM“解释”。但是,我真的不知道字节码是什么,以及JVM在Java语言体系结构中的实际含义。我想进一步了解他们。 问题答案: JVM(Java虚拟机)具有与真实计算机一样的指令集。给该指令集的名称是Java字节码。在Java虚拟机规范中对其进行了描述。其他语言在执行之前会被翻译成字节码,例如ruby和python

  • 本文向大家介绍Java字节码中jvm实例用法,包括了Java字节码中jvm实例用法的使用技巧和注意事项,需要的朋友参考一下 要想使Java运行,我们可以设计一个面向Java语言特性的虚拟机,并通过编译器将Java程序转换为它可以识别的指令序列,也称为Java字节码。由于Java字节码指令的操作码被固定为一个字节,所以它的名字就这样命名了。本篇要带来的是Java字节码中jvm的使用,主要分为两个操作

  • 当试图通过IntelliJ运行示例CorDapp(GitHub CorDapp)时,我收到以下错误: 无法将用JVM目标1.8构建的字节码内联到正在用JVM目标1.6构建的字节码中 如何修改IntelliJ设置,使所有字节码都是用相同的JVM目标构建的?

  • 问题内容: 我试图了解Python的工作原理(因为我一直都在使用它!)。据我了解,当您运行python script.py之类的脚本时,该脚本将转换为字节码,然后解释器/ VM / CPython(实际上只是一个C程序)读取python字节码并相应地执行该程序。 该字节码如何读入?它类似于在C语言中读取文本文件的方式吗?我不确定Python代码如何转换为机器代码。是否确实是Python解释器(CL