Java Bytecode

2025 年 7 月 7 日 | 阅读 4 分钟

Java 字节码是 JVM 可以理解的 Java 代码指令集。Java 程序一旦编译,就会生成该代码的字节码。简单来说,Java 字节码就是 .class 文件形式的机器码。借助 Java 字节码,我们在 Java 中实现了平台无关性。机器或平台无关代码是指无需任何修改即可在多个计算机体系结构上运行的代码。

字节码分隔了低级和高级指令集。由于我们用高级语言编写代码,它会被编译成字节码,然后 JVM 将字节码解释为机器码,这是低级可执行指令集。因此,我们将字节码称为跨越低级和高级语言的代码。

它是如何工作的?

当我们编译 Java 代码时,编译器会编译该程序,并为该代码片段生成字节码(.class 文件)。当我们在任何其他平台上执行此 .class 文件时,它会轻松执行。

第一次编译后,生成的字节码现在由 Java 虚拟机而不是指定的处理器运行。这意味着我们只需要在任何要运行代码的平台上进行基本的 Java 安装。

Java 虚拟机通过调用处理器来分配所需资源,从而提供运行字节码所需的资源。JVM 是基于堆栈的,因此 JVM 维护一个堆栈来读取代码。

Java Bytecode

Java 字节码的优点

JVM 的指令集可能因系统而异,但都可以解释字节码。需要注意的是,字节码是不可运行的代码,依赖解释器的可用性来执行;因此,JVM 在此发挥作用。

  • 平台无关性:字节码运行在 Java 虚拟机 (JVM) 上,JVM 在许多平台上都可用。这意味着我们可以编写一次代码,然后在任何地方(不同平台)运行它,而无需修改。
  • 安全性:字节码在 JVM 内部运行,JVM 就像一个沙箱。它有助于阻止恶意代码损坏主机系统。JVM 在运行之前还会验证字节码以识别不安全的操作。
  • 性能优化:JVM 在运行时使用即时 (JIT) 编译将字节码转换为本机机器码,随着程序的运行,性能会随着时间的推移而提高。
  • 库和工具的可移植性:由于字节码是标准化的,Java 库和工具可以在不同平台之间共享,而无需重新编译。这使得开发和部署更加顺畅。
  • 紧凑高效:字节码比源代码更紧凑,这减小了编译程序的尺寸,并加快了加载和执行速度。
  • 支持动态链接:字节码允许类在运行时动态加载和链接,从而实现模块化和灵活的应用程序设计。

Java 字节码示例

考虑以下用于将两个数字相加的 Java 程序。

示例

编译并运行

输出

15

使用命令 javap -c Main 编译上述程序。编译后,我们得到以下字节码。

我们观察到 Java 代码已转换为字节码(一种不可读的形式)。

  • iconst_5 和 bipush 10 加载常量 5 和 10。
  • iadd 将两个整数相加。
  • getstatic 和 invokevirtual 处理 System.out.println 调用。
  • new、dup 和 invokespecial 创建并初始化 StringBuilder。

Java 字节码选择题

1. 哪个组件负责执行 Java 字节码?

  1. JVM
  2. JDK
  3. JRE
  4. JIT
 

答案:A

解释:Java 字节码是 JVM 可以理解的 Java 代码指令集。因此,JVM 负责执行 Java 字节码。


2. 编译后的 Java 类的文件扩展名是什么?

  1. .java
  2. .exe
  3. .class
  4. .jar
 

答案:C

解释:当我们编译 Java 代码(.java 文件)时,我们会得到字节码,它是一个 .class 文件。


3. 使用什么工具来查看已编译 Java 类的字节码?

  1. javac
  2. java
  3. Javadoc
  4. javap
 

答案:D

解释:我们使用 javap 命令来查看已编译 Java 类的字节码。编译后,我们得到以下字节码。


4. 以下哪个是有效的字节码指令?

  1. add()
  2. iadd
  3. sum()
  4. add
 

答案:B

解释:一些有效的字节码指令包括 istore、iadd、iload、dup 和 new。


5. JVM 在执行字节码之前做什么?

  1. 将其转换为 C 代码
  2. 对其进行安全性和正确性验证
  3. 加密
  4. 发送到操作系统内核
 

答案:B

解释:字节码在 JVM 内部运行,JVM 就像一个沙箱。它有助于阻止恶意代码损坏主机系统。JVM 在运行之前还会验证字节码以识别不安全的操作,并提供安全性和正确性。