我正在查看Hotspot VM JIT编译器的一些输出本机代码。我正在分析的方法使用了很多局部变量。我曾预计这会溢出寄存器分配,并在内存中进行加载/存储。但是,我在本机代码中看不到任何加载/存储指令。为此,我有2个相关问题。
我已经读到Java VM具有基于堆栈的体系结构,在该体系结构中,不是使用寄存器作为暂存器进行计算,而是使用堆栈。因此,JIT编译器是否也遵循基于堆栈的模型还是基于寄存器的模型?
如果JIT是基于寄存器的,那么JIT编译器在用尽寄存器时会做什么? JIT编译器是否执行其他某种技术来处理这种情况,还是仅由于我没有足够的局部变量而导致我看不到任何从内存中加载/存储的情况?
最佳答案
首先,您的问题取决于您使用的JVM和CPU架构。
我假设您是在谈论热点。
因此,JIT编译器是否遵循基于堆栈的模型还是基于寄存器的模型?
字节码在堆栈上运行,但经过多层转换,最后一层是基于寄存器的。
如果JIT是基于寄存器的,那么JIT编译器在用尽寄存器时会做什么?
它可能会溅到堆栈上,也可能会应用其他优化来降低套准压力,具体取决于它们的成本。
但是以前的优化阶段也可能已经生成了适合可用寄存器的代码。仅仅因为在方法中使用了N个局部变量,并不意味着在任何给定时间都需要N个寄存器。
看一下OpenJDK wiki,它有几页有关寄存器分配的内容,还有较早的优化步骤。