Java JIT编译器寄存器优化

时间:2015-11-09 11:19:47

标签: java memory jvm jit register-allocation

我正在查看来自Hotspot VM JIT编译器的一些输出本机代码。我正在分析的方法使用了很多局部变量。我原以为这会溢出寄存器分配并在内存中进行加载/存储。但是,我在本机代码中看不到任何加载/存储指令。为此,我有2个相关问题。

  1. 我已经读过Java VM有一个基于堆栈的架构,而不是使用寄存器作为计算的暂存器来使用堆栈。那么,JIT编译器是否遵循基于堆栈的模型或基于寄存器的模型?

  2. 如果JIT是基于寄存器的,JIT编译器在用完寄存器时会做什么? JIT编译器是否执行了一些其他技术来处理这种情况,或者是因为我没有足够的局部变量而没有看到任何内存加载/存储的情况?

1 个答案:

答案 0 :(得分:2)

首先,您的问题取决于您正在使用的JVM和CPU架构。

我假设你在谈论热点。

  

因此,JIT编译器是否遵循基于堆栈的模型或基于寄存器的模型?

字节码在堆栈上运行,但是通过多个层进行转换,最后一个是基于寄存器的。

  

如果JIT是基于寄存器的,那么JIT编译器在用完寄存器时会做什么?

它可能溢出到堆栈上,或者它可能会应用其他优化来降低注册压力,具体取决于它们的成本。

但是之前的优化阶段也可能已经生成了适合可用寄存器的代码。仅仅因为你在方法中使用N个局部变量并不意味着你在任何给定的时间都需要N个寄存器。

看一下OpenJDK wiki,它有几个关于寄存器分配和早期优化步骤的页面。

相关问题