为什么java中的引用类型占用8个字节?为什么不小于或大于 8 个字节?
最佳答案
实际上,并没有规定一个引用变量应该有多少字节,事实上,它并不是到处都一样。
32位系统(即内存总线中有32位地址的系统)的常见虚拟机通常使用32位(= 4字节,与int
和float
) 作为对象引用的大小,而 64 位系统的虚拟机通常使用 64 位(= 8 字节)的 native 地址大小。 (请注意,大多数 64 位系统也可以运行 32 位程序,因此即使在那里您也经常使用 32 位 VM。)
这只是简化实现的问题,如果您可以使用实际的内存地址而不是其他内容作为引用。
因为这会增加所用内存的大小(通常我们实际上并不需要访问那么那么多内存),from Java 7 on 64 位 HotSpot VM 在特定条件下可以使用 32 位引用,即当堆小于 32 GB(8·232 字节)时。要将它们转换为实际内存地址,将它们乘以 8(因为对象将在 8 字节边界上对齐),然后添加到基地址(如果它不为零)。 (对于小于 4 GB 的堆,我们不需要乘法步骤。)
其他 VM 可能会使用类似的技巧。
关于java - java中的引用类型大