转:http://blog.sina.com.cn/s/blog_605f5b4f0100qt2t.html
Question:JAVA中的引用的内存分配大小是多少?
如,我声明了一个对象,它在栈中就先有了个空间,(用来放地址引用的),这个空间的大小是多少?
java规范中并没有强行定义虚拟机中任何一种类型在虚拟机中所占用内存的具体大小,但是规范规定了每种类型的取值范围。从这种角度上看,每种类型会有一个最小位宽,或者内存占用大小。
而且java虚拟机规定中,在方法区中所占用的内存大小与在栈帧所占用的内存大小不同,因为在方法区中占用内存以字节为最小单位,但是在战帧中以字为最小单位。如byte类型在方法区中它占用8位,为一个字节,但是在栈帧中以一个字,即32位来处理,其实就是当作一个int类型来处理。
楼主所说的引用类型,其位宽与int型一样,在方法区中它占用32位,4个字节,在栈帧中占用一个字。
但是虚拟机实现者可以扩大这种内存占用量,因为虚拟机规定只要满足取值范围即可,并没有规定非要32位一个字才行。
我觉得java的引用相当于c++的指针,C++的指针是占四个字节,java引用应该也是固定的大小。sunhotspot jvm和ibmjvm中都把引用实现为一个指针,因此在64位平台上,占8个字节,在32位平台上占4个字节。别的jvm不清楚。
1.引用本身的大小和操作系统的位数有关,正如15楼所言在64位平台上,占8个字节,在32位平台上占4个字节,这个应该是很自然的事情,因为32-bit的操作系统,在4G(2^32)的内存空间内找到某个地址,这个地址是用4bytes(32bits)来表示的。
2. 引用本身是保留在栈中的
3. 引用所指的对象,是存放在堆中的
整理自:http://topic.csdn.net/u/20090419/11/b90d9a7b-336e-40e1-afbe-0174ebf1144f.html