JVM的字长和操作数栈

8

JVM规范指出,在许多实现中,jvm操作数栈的工作单位为字大小,这在32位系统中通常是本机指针的大小-4个字节,在64位系统中为8个字节。我的问题是,如果被压入堆栈的操作数是char(2个字节),而操作数栈按字大小(64位系统中为8个字节)推入和弹出操作数,那么这不是浪费空间吗?


JVM的字长被指定为32位,它不依赖于平台。 - chrylis -cautiouslyoptimistic-
真实,但大多数实现选择平台本地指针的大小 - http://www.artima.com/insidejvm/ed2/jvm3.html - BestCoderEver
这与JVM堆栈无关,它是一个逻辑结构,看起来与现代JIT实现不太一样。Java字,在Java字节码指令操作的基础上,有32位,就是这样。如果你在询问JVM实现方面的问题,那就是一个不同的问题。 - chrylis -cautiouslyoptimistic-
2个回答

9

是的,它是"浪费的空间",但它极大地简化了运行时,而且字长与它们构建的CPU相匹配,因此虽然浪费空间,但在CPU处理方面更加高效。

而且这仅仅是针对运行时参数,而不是实际存储的数据。

最后,如果你查看大多数Java程序,它们传递的大部分内容都是指向对象的指针,而不是标量。因此,在清洗过程中,它们基本上都能正常工作。


谢谢。所有流行的实现,例如HotSpot和OpenJDK,都使用这个模型吗?没有办法优化空间利用率了吗?(例如内存压缩或类似的东西?) - BestCoderEver
你需要区分以下三种情况:a) 指针的内存布局 b) 原始类型的内存布局 c) CPU 内部表示(例如,AVX 寄存器可能用于向量化循环)。没有简单的答案可以涵盖所有情况。它们都与 Java 栈机的概念相当独立。 - the8472
“空间使用”仅在变量实际加载到堆栈上时发生,而不是当它们存储在数组等中时发生。当变量加载到堆栈上时,它们必须存储在基于字大小的CPU寄存器中。这实际上并不浪费空间。 - Louis Wasserman

3
"Java虚拟机"是一个抽象模型,描述了Java程序如何执行。实际的JVM实现(例如来自Oracle JDK的HotSpot JVM)可以在任何地方或根本不分配Java操作数堆栈。
例如,在JIT编译的方法中,一些操作数可以保存在CPU寄存器中,甚至被视为立即常量,而不占用真正的堆栈空间。此外,内联方法没有自己的堆栈帧,它们与父帧共享。
因此,这并不是浪费,因为规范不会阻止JVM实现使用优化表示。尽管JVM通常不关心:堆栈空间通常不是限制因素 - 堆栈主要保存少量临时值,而实际数据驻留在Java堆中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接