1

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

  1. 我读过Java VM具有基于堆栈的体系结构,其中使用堆栈而不是使用寄存器作为计算的暂存器。因此,JIT 编译器是否也遵循基于堆栈的模型或基于寄存器的模型?

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

4

1 回答 1

2

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

我假设你在谈论热点。

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

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

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

它可能会溢出到堆栈上,也可能会应用其他优化来减少寄存器压力,具体取决于它们的成本。

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

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

于 2015-11-09T21:34:53.973 回答