首页 > 解决方案 > java机器代码在同一硬件上是否相同?

问题描述

我知道 java 源代码将被编译为字节码,JVM 将解释该字节码并将其转换为底层平台的本机机器代码。

但是我想知道我是否有一台x86机器,无论我选择安装哪个操作系统,平台相关的JVM翻译的机器代码是否相同?

标签: javajvmbytecode

解决方案


TL;DR - 不,它不会。

JIT 编译器从相同的字节码、相同的 Java 版本以及在相同的操作系统上生成的本机代码仍然可能不同

  • 生成的代码可能取决于运行 JVM 的物理硬件;例如内核数量、芯片组等。

  • 生成的代码甚至可能取决于程序的输入。在 JIT 编译之前,JVM 使用字节码解释器来运行代码。这种自我分析收集有关分支概率等的统计信息。JIT 优化器使用这些统计信息。由于运行程序时采用的代码路径可能取决于程序输入,因此同一台机器上同一程序的不同运行可能最终导致 JIT 编译器生成不同的本机代码。

  • 由于 JVM 预热期间的非确定性行为会影响自分析期间收集的统计信息,因此生成的代码甚至可能在具有相同输入的相同平台上运行相同代码之间存在差异。

这就是 HotSpot JIT 编译的好处。它适应环境以及应用程序的功能。但是,如果您的主要目标是获得可重现的本机代码和可重现的性能特征,这可能是一个问题。


推荐阅读