java中的普通指令和快速指令有什么区别(例如aload和fast_aload)

Nei*_*nke 5 java jvm bytecode instructions java-11

我打印了一个简单java程序的执行字节码,并注意到一些java指令是fast_xxxx而不是普通指令。

我在 JVM 规范中找不到任何相关内容。那么这些指令之间到底有什么区别,口译员何时/为何选择使用这些指令呢?

编辑:字节码是用-XX:TraceBytecodes选项打印的。

Mik*_*kov 4

那么这些指令到底有什么区别呢?

简而言之:fast_变体是优化的架构相关的指令替换

这些优化从何而来?

JVM 模块解释器。它可以工作在非补丁和补丁模式下。一些相关的 JVM 选项:

RewriteBytecodes- 允许重写字节码

RewriteFrequentPairs- 将常用的字节码对重写为单个字节码

...

实现 - https://hg.openjdk.java.net/jdk/jdk11/file/tip/src/hotspot/share/interpreter/bytecodeInterpreter.cpp

http://hg.openjdk.java.net/jdk/jdk11/file/tip/src/hotspot/share/interpreter/bytecodes.cpp - 包含许多快速字节码的定义(请参阅 Bytecodes::initialize()),其中一组快速字节码字节码已定义。此外,可以在依赖于平台的代码区域中定义快速字节码。重写的字节码取决于体系结构。嗯,至少,有些是,有些不是。

口译员何时/为何选择使用这些?

JVM 具有重写字节码流的能力,例如组合常见指令对。至少大多数(如果不是全部)字节码到fast_版本的转换只是为了性能而完成的,并且可以禁用。这样做会影响口译员的表现。