java - Hotspot JVM 是将代码编译为机器代码还是简单地运行它

标签 java jvm jit

为了简化问题,我们假设在我们的 JRE 中,我们有一个不使用 JIT 的 Hotspot JVM 实现。 这意味着我们不会预编译机器代码。

我想理解,JVM在遇到字节码时,解释器是否使用Hotspot编译器将代码编译为机器码,然后JVM才能运行代码? 或者解释器只是运行代码,因为 JVM 有某种与每个字节码命令相对应的 native 方法?

最佳答案

Meaning we won't have machine code precompiled.

你上面这句话表明你对JIT编译器是什么有误解。它不会提前编译代码,而是及时编译,因此得名。

这使得你的问题的其余部分更难理解,因为“HotSpot 编译器”是 JIT 编译器。

但是,总结一下:在正常情况下,HotSpot 首先解释字节码,然后 JIT 编译那些运行时分析数据表明它们是“热点”的片段,并被大量执行(默认阈值是对一段代码进行 10,000 次传递)。

如果禁用 JIT 编译,HotSpot 确实只会解释所有 Java 字节码。

关于java - Hotspot JVM 是将代码编译为机器代码还是简单地运行它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27379447/

相关文章:

Java 数据库连接类一直将连接返回为 Null

java - Java 运行时环境 : SIGSEGV (0xb) at pc=0x00002b2f7e9b2744, pid=28778,tid=1138739520 检测到 fatal error

java - 虚拟机参数 : Retrieve correctly and programmatically

c - 现在有哪些免费的 JIT 编译器,哪个更容易使用?

node.js - 为什么空对象比非空对象占用更多内存?

c++ - 我可以将现有方法绑定(bind)到 LLVM 函数* 并从 JIT 编译的代码中使用它吗?

java - 访问HBase表-普通的Java与MR作业

java - 列出数组列表的一部分

java - java中的字符串分割

java - 为什么有很多语言使用 JVM?