本地变量的最大内存分配

3
在Java中,局部变量的最大内存空间是否为32位?如果是,那么当我在我的Java代码中使用数据类型为long(64位)的局部变量时会发生什么?这个变量会以何种方式分配内存?每当我搜索答案时,我都只能得到与Java内存区域有关的解释,它们解释了局部变量在堆栈中所处的方法框架中的位置(我知道这点没问题),但这显然不是对我的问题的相关回答。

本地原始变量分配在堆栈上。您还需要知道什么?您的问题不清楚。 - Jim Garrison
1
Java的规范有意留出空间来实现这样的东西。作为Java程序员,你只需要知道long是一个64位有符号数字,在其作用域内存储时与平台无关即可。 - zapl
2个回答

2

JVM通常会在堆栈上对本地变量进行字节对齐,这意味着它们在32位JVM上占用32位(除了longdouble,它们将占用64位),并且它们将在64位JVM上占用64位。 JVM允许对变量进行压缩,以占用更少的空间(例如,将4个byte放入32位单词中,而不是将4个byte放入4个单独的单词中),但这比使所有变量对齐更慢,因为处理器在使用它们之前必须对它们进行解包。


2
原始的虚拟机规范在本地变量方面实际上非常混乱,每个本地变量都在堆栈上保留了一个“插槽”(仅是索引号),并且每个插槽应该容纳4个字节。因此,每个变量都映射到一个“插槽”。但是,占用超过4个字节(双倍长)的变量需要占用两个连续插槽。然而,引用确实只占用一个插槽,尽管它们在64位VM上可能是8个字节。当指定此规范时,不存在64位VM,因此规范假定32位引用。
实际上,我相信任何当前的VM都会根据需要重新映射堆栈插槽,并且实际上在堆栈上保留的大小也将由VM决定。因此,所有剩下的只是字节码中奇怪的插槽分配方案,所有实际的“插槽”内容纯粹是在字节码级别上 - VM不需要物理上遵循字节码指定的插槽布局。
请查看字节码规范:http://docs.oracle.com/javase/specs/jvms/se5.0/html/Overview.doc.html#17257

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