Java JIT编译器寄存器优化

标签 java memory jvm jit register-allocation

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

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

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

最佳答案

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

我假设您正在谈论热点。

Thus, is the JIT compiler as well follow a stack-based model or a register-based one?

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

If the JIT is register-based, what does the JIT compiler do upon running out of registers?

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

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

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

关于Java JIT编译器寄存器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33608008/

相关文章:

java - 检查对象是否包含数组列表中的值不起作用

c - 在 4.x.x 内核的 64 位内存中查找系统调用表

c++ - 这两个类有什么区别?

java - Java JNA调用的dll中分配内存错误

java - 现代 JVM 是否优化只读集合分配

java - 解码具有大文本元素的 xml 文件时出现 Axis2/JAX-WS 错误

java - 如何从使用反射实现接口(interface)的类的字段中获取值?

java - 文本解析: Distinguish between "dictionary words" and names

c++ - Gzip 内存压缩

java - Mavericks OS X 上的几个应用程序请求安装 Java 6 SE 运行时,但已经有 Java 7