java 中的普通指令和快速指令有什么区别(例如 aload 和 fast_aload)
Whats the difference between a normal instruction and a fast instruction in java (e.g. aload and fast_aload)
我打印了一个简单的 java 程序的执行字节码并注意到一些 java 指令是 fast_xxxx 而不是正常指令。
我在 JVM 规范中找不到任何相关信息。
那么这些指令和when/why解释器选择使用这些指令之间到底有什么区别?
编辑:字节码使用-XX:TraceBytecodes
选项打印。
So what exactly is the difference between these instructions?
简而言之:fast_
变体是优化的架构相关指令替换
Where do these optimizations come from?
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()
) 其中定义了一组快速字节码。此外,可以在依赖于平台的代码区域中定义快速字节码。重写的字节码依赖于架构。嗯,至少,
有些是,有些不是。
When/why does the interpreter choose to use these?
JVM 具有重写字节码流的能力,例如
组合通用指令对。至少大多数(如果不是全部的话)到 fast_
版本的字节码转换只是为了性能而完成的,可以被禁用。这样做会影响口译员的表现。
我打印了一个简单的 java 程序的执行字节码并注意到一些 java 指令是 fast_xxxx 而不是正常指令。
我在 JVM 规范中找不到任何相关信息。 那么这些指令和when/why解释器选择使用这些指令之间到底有什么区别?
编辑:字节码使用-XX:TraceBytecodes
选项打印。
So what exactly is the difference between these instructions?
简而言之:fast_
变体是优化的架构相关指令替换
Where do these optimizations come from?
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()
) 其中定义了一组快速字节码。此外,可以在依赖于平台的代码区域中定义快速字节码。重写的字节码依赖于架构。嗯,至少,
有些是,有些不是。
When/why does the interpreter choose to use these?
JVM 具有重写字节码流的能力,例如
组合通用指令对。至少大多数(如果不是全部的话)到 fast_
版本的字节码转换只是为了性能而完成的,可以被禁用。这样做会影响口译员的表现。