局部变量的最大内存分配

时间:2013-07-29 20:24:34

标签: java variables local

在Java中,本地变量是否分配了32位的最大内存空间?如果是,如果我在我的java代码中的方法中使用数据类型为long(64位)的局部变量会发生什么?以以何种方式将内存分配给此变量?

每当我用Google搜索得到答案时,我得到的解释只涉及java内存区域,它解释了哪里(在堆栈中相关方法的框架中.. ,我知道这个)a局部变量获取内存,这肯定不是我查询的相关响应。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

原始VM规范实际上对于局部变量实际上是混乱的,每个局部变量在堆栈上重新设置了一个“槽”(简称索引号),每个槽应该包含4个字节。因此每个变量都映射到一个“槽”。但是占用超过4个字节(double,long)的变量需要占用两个连续的插槽。但是,引用确实占用一个插槽,尽管它们在64位VM上可能是8个字节。指定时没有64位VM,因此规范假定32位引用。

实际上,我很确定当前的VM会重新映射堆栈插槽,因为它认为合适,堆栈上保留的实际大小也将由VM决定。所有剩下的就是字节代码中特有的插槽分配方案,所有实际的“插槽”内容纯粹是在字节码级别上 - 虚拟机不需要物理上遵循指定字节码的插槽布局。

查看字节码规范:http://docs.oracle.com/javase/specs/jvms/se5.0/html/Overview.doc.html#17257