为了简化问题,我们假设在我们的 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/