在 Java 中,是否为局部变量分配了 32 位的最大内存空间?如果是,如果我在 java 代码的方法中使用数据类型为 long(64 位)的局部变量会发生什么?以什么方式将内存分配给这个变量?
每当我用谷歌搜索得到答案时,我得到的解释仅与 java 内存区域相关,它解释了在哪里(在堆栈中相关方法的框架中……没关系,我知道这一点)局部变量获取内存,这肯定不相关回应我的询问。
JVM 通常在堆栈上对局部变量进行字对齐,这意味着它们在 32 位 JVM 上占用 32 位(long
s 和double
s 除外,它们将占用 64 位)并且在 64 位上它们将占用 64 位JVM。JVM 被允许打包变量,以便它们占用更少的空间(例如,将 4 byte
s 放在一个 32 位字中,而不是将 4 byte
s 放在 4 个单独的字中),但这比让所有变量都字对齐要慢,因为处理器在使用它们之前必须将它们拆开。
最初的 VM 规范实际上在局部变量方面确实搞砸了,每个局部变量都在堆栈上保留了一个“槽”(只是一个索引号),每个槽应该容纳 4 个字节。所以每个变量都映射到一个“槽”。但是占用超过4个字节(double、long)的变量需要占用两个连续的slot。然而,引用确实占据了一个插槽,尽管它们在 64 位 VM 上可能是 8 个字节。指定时没有 64 位 VM,因此规范假定使用 32 位引用。
在实践中,我很确定任何当前的虚拟机都会重新映射它认为合适的堆栈插槽,并且堆栈上保留的实际大小也将由虚拟机决定。所以剩下的就是字节码中一个特殊的插槽分配方案,所有实际的“插槽”内容纯粹是在字节码级别上——VM 不需要物理地遵守字节码指定的插槽布局。
查看字节码规范:http ://docs.oracle.com/javase/specs/jvms/se5.0/html/Overview.doc.html#17257