Java 为什么热点需要寄存器分配?

Java 为什么热点需要寄存器分配?,java,llvm,jvm-hotspot,Java,Llvm,Jvm Hotspot,下面是我读到的关于JVM的内容。HotSpot是基于堆栈的,Dalvik是基于寄存器的。若HotSpot是基于堆栈的,那个么当我们将代码表示为块时,为什么不需要进行寄存器分配呢 另外,llvm在哪里适合这种情况?我读到我们可以使用llvm核心和后端来编写java源代码。HotSpot是否使用LLVM?现代CPU使用多个寄存器,要将字节码转换为机器码,必须使用这些寄存器 LLVM是与操作系统交互的虚拟机。HotSpot不使用LLVM,尽管有人多次建议使用它。HotSpot不是基于堆栈的,标准jav

下面是我读到的关于JVM的内容。HotSpot是基于堆栈的,Dalvik是基于寄存器的。若HotSpot是基于堆栈的,那个么当我们将代码表示为块时,为什么不需要进行寄存器分配呢


另外,llvm在哪里适合这种情况?我读到我们可以使用llvm核心和后端来编写java源代码。HotSpot是否使用LLVM?

现代CPU使用多个寄存器,要将字节码转换为机器码,必须使用这些寄存器


LLVM是与操作系统交互的虚拟机。HotSpot不使用LLVM,尽管有人多次建议使用它。

HotSpot不是基于堆栈的,标准java字节码是基于堆栈的。HotSpot是一个优化运行时,它允许使用任何可以想象的技巧快速执行代码,实现JVM规范定义的基于堆栈的机器的操作语义。由于所有相关的CPU架构都是面向寄存器的,所以HotSpot自然会利用这一点并使用寄存器分配


HotSpot不使用llvm,它是一个独立的开发。就我所见,有一个基于llvm的JVM实现称为J3,与HotSpot无关。

当你说“将字节码转换为机器码”是什么意思?因为编译器本身毕竟是一个程序,它将使用本机内存和寄存器来完成它的工作。我认为寄存器分配是针对源代码本身的。如果i=j+1,则将i移动到寄存器,加载j,添加2,依此类推。在此上下文中,没有使用堆栈,但热点是基于堆栈的。这就解决了我的困惑,也就解决了这个问题。
javac
编译器检查有效性,而JIT并没有真正编译成机器代码。根据这里提到的内容,我推断主要有两种VM体系结构,HotSpot是基于堆栈的,Dalvik也是基于寄存器的。这是不正确的吗?是的,这是不正确的,或者至少是不精确的。Dalvik定义了自己的基于寄存器的字节码模型,而HotSpot使用基于堆栈的标准字节码。这并没有使所讨论的JVM运行时基于堆栈或寄存器,正如它们都可以运行Clojure代码使它们面向列表一样。具体地说,这篇文章混淆了实现和规范。Java标准指定了一个基于堆栈的虚拟机,但没有实现它。同样,Android运行时指定了一个基于寄存器的虚拟机,dalvik是实现它的运行时。基于堆栈的虚拟机的实现本身不需要基于堆栈——事实上,它不是。将此答案标记为已接受。消除了我的困惑。感谢您的投入!