java中的引用类型大小

为什么java中的引用类型占用8个字节? 为什么不少于或多于8个字节?

实际上,它没有指定引用变量应该有多少字节,事实上,它并不是每个地方都相同。

用于32位系统的通用虚拟机(即内存总线中具有32位地址的系统)通常使用32位(= 4字节,与intfloat相同)作为对象引用的大小,而64位虚拟机通常使用系统通常使用64位(= 8字节)的本地地址。 (请注意,大多数64位系统也可以运行32位程序,所以即使在那里你也常常使用32位VM。)

如果您可以使用实际的内存地址作为引用而不是其他内容,那么这只是简化实现的问题。

由于这会增加所用内存的大小(通常我们实际上并不需要访问那么多内存),因此64位HotSpot VM 上的Java 7将能够在某些条件下使用32位引用,即堆小于32 GB(8·2 32字节)。 要将它们转换为实际的内存地址,它们将乘以8(因为对象将在8字节边界上对齐),然后将其添加到基址(如果这不是零)。 (对于小于4 GB的堆,我们不需要乘法步骤。)

其他VM可能会使用类似的技巧。

这是因为引用变量实际上不包含该对象。 这是一种到达目标的方法。 JVM管理它的方式是我们最不关心的问题。 您可以将其视为堆中对象位置的地址。 但它不必像地址一样直截了当。

让我举个例子来帮助你更好地理解

  String myName = new String("John"); String yourName = new String("John"); if (myName == yourName) { System.out.println("Refereces point to Same objects on heap"); } else { System.out.println("Refereces point to different objects on heap"); } 

输出是Refereces指向堆上的不同对象

这里myNameyourName是两个引用,它们指向String类型的对象( 在Heap上分配的内存 )。 注意参考变量的内存是在堆栈上分配的,而不是在堆上 。 两个引用变量仅具有驻留在Heap上的String对象的地址(或类似的唯一抽象)。 对于特定的OS体系结构,地址的大小将是恒定的。 在32位的情况下,它将是4个字节,对于64位,它将是8个字节。

因此,指向的对象大小可能会改变,但引用的大小保持不变,因为它们只是携带对于任何特定体系结构保持不变的地址。

8字节是Java中Long变量的大小,允许引用1.01457092×10 ^ 19个引用,对于大多数应用程序来说应该足够了,并且考虑到每个参考点都需要也比大多数硬盘驱动器更大持有数据……

编辑:在阅读了其他一个答案后,我想澄清一下,该引用只是一个指向数据的指针,并且不包含数据,Java架构师决定使用64位值来表示引用,因为它为您提供了一个巨大的地址空间。

类型引用的值可以被认为是指向对象的指针。 8字节应该在堆中添加它。

阅读Java虚拟机的结构