Java字节码到机器码的转换

时间:2018-10-24 00:14:25

标签: java jvm jit

JVM何时将字节码转换为机器码? 1.在上课时每个班仅一次? 2.在创建班级的每个对象时,是否使用学生班的示例学生对象? 3.还是在每次方法调用期间?

在方法调用期间如何与方法堆栈同步。

2 个答案:

答案 0 :(得分:1)

  
      
  1. 在加载课程时每个课程仅一次?
  2.   
  3. 在创建类的每个对象时?
  4.   
  5. 在每个方法调用期间?
  6.   

以上都不是!

首次加载该类时,当调用方法来收集一些统计信息时,JVM将解释字节码。稍后,JVM将选择已被调用几次的方法,并将那些方法编译为本地代码。

但这还没有结束。在某些情况下,JIT编译器实际上可能会重新编译/重新优化它已经编译的方法。例如,如果(懒惰地或动态地)加载了另一个类而使先前的优化基础无效,则会发生这种情况。


  

在方法调用期间如何与方法堆栈同步。

详细的实施细节。 (但是我认为解释字节码和运行编译的本机代码时,方法的堆栈布局相同。)

答案 1 :(得分:1)

“感觉很像”。我并不是故意要轻浮,但是没有一般性的答案。

JVM可以解释字节码,也可以将其编译为本机代码。机器代码运行速度更快,但是编译它花费时间和空间。因此,需要进行权衡,并且没有要求以一种或另一种方式来进行权衡。实际上,从一个JVM到另一个,或者从一个版本到另一个,它可能有所不同。

该主题称为“及时”编译(JIT),将有不同的实现。请查阅您的JVM文档。

我的猜测是,一种可能的机制是注意到同一方法已经“执行了多次”,因此将从编译为机器代码中受益。也就是说,您的#3答案可能是最接近的。

相关问题