java - java机器代码在同一硬件上是否相同?
问题描述
我知道 java 源代码将被编译为字节码,JVM 将解释该字节码并将其转换为底层平台的本机机器代码。
但是我想知道我是否有一台x86机器,无论我选择安装哪个操作系统,平台相关的JVM翻译的机器代码是否相同?
解决方案
TL;DR - 不,它不会。
JIT 编译器从相同的字节码、相同的 Java 版本以及在相同的操作系统上生成的本机代码仍然可能不同。
生成的代码可能取决于运行 JVM 的物理硬件;例如内核数量、芯片组等。
生成的代码甚至可能取决于程序的输入。在 JIT 编译之前,JVM 使用字节码解释器来运行代码。这种自我分析收集有关分支概率等的统计信息。JIT 优化器使用这些统计信息。由于运行程序时采用的代码路径可能取决于程序输入,因此同一台机器上同一程序的不同运行可能最终导致 JIT 编译器生成不同的本机代码。
由于 JVM 预热期间的非确定性行为会影响自分析期间收集的统计信息,因此生成的代码甚至可能在具有相同输入的相同平台上运行相同代码之间存在差异。
这就是 HotSpot JIT 编译的好处。它适应环境以及应用程序的功能。但是,如果您的主要目标是获得可重现的本机代码和可重现的性能特征,这可能是一个问题。
推荐阅读
- java - 使用wildfly在mysql中插入印地语文本时出现问题
- excel - 从一张纸复制数据并将其粘贴到另一张纸上
- smartcard - 我可以解锁我的 SLE4442 智能卡吗?PUK码是否存在?
- java - 如何避免将spring boot fat jar安装/部署到maven repo
- drupal - 禁用在联系表格 Drupal 7 中向发件人发送副本
- python - PSO 可以基于 ODE 的实验数据工作吗?
- oracle - 出现错误 ORA-06502: PL/SQL: numeric or value error
- android - 从xamarin表单android中的操作栏中的单击事件添加下拉菜单
- docker - 通过主管脚本创建应用程序的启动顺序
- arrays - 如何解析 json 对象并打印特定值