Java类中成员变量的内存占用

Java类中成员变量的内存占用,java,Java,我试图理解由类中的各种数据成员检测的java类的内存占用。我在这篇文章中找到了一些背景材料: 基于此,我的理解是,如果一个类只有一个基元类型的数组,那么数组声明本身应该消耗12个字节。类头应该再占用12个字节。SingleArray类型的对象的总内存占用空间为24字节 public class SingleArray { int[] array1; } 使用对象检测,我发现SingleArray的一个对象确实消耗了24个字节而没有任何数据。在这方面,DoubleArray类的对象应该

我试图理解由类中的各种数据成员检测的java类的内存占用。我在这篇文章中找到了一些背景材料:

基于此,我的理解是,如果一个类只有一个基元类型的数组,那么数组声明本身应该消耗12个字节。类头应该再占用12个字节。SingleArray类型的对象的总内存占用空间为24字节

public class SingleArray {
    int[] array1;
}
使用对象检测,我发现SingleArray的一个对象确实消耗了24个字节而没有任何数据。在这方面,DoubleArray类的对象应该消耗40字节(考虑填充):


但是DoubleArray类型的对象似乎也消耗24字节。我很困惑。我遗漏了什么?

首先要更正,
数组声明和
类标题不消耗内存,分配的对象会消耗内存

SingleArray
DoubleArray
的实例消耗多少内存?最后,这取决于JVM运行时,但今天最有可能的数字是:

SingleArray
的实例:16字节

  • 对象的字节数为8
  • 4个字节用于引用成员
    array1
  • 4个字节用于填充,以获得8个字节的倍数
双数组的实例:16字节

  • 对象的字节数为8
  • 4个字节用于引用成员
    array1
  • 4个字节用于引用成员
    array2
  • 0字节用于填充,以获得8字节的倍数

好吧,不管博客上说什么,眼见为实。我从下载了jol-cli-0.3.2-full.jar,并使用

java -jar jol-cli-0.3.2-full.jar internals -cp bin x.SingleArray
它为Java HotSpot(TM)64位服务器VM(build 25.66-b17,混合模式)上的SingleArray提供以下输出:

对于双阵列:

 OFFSET  SIZE   TYPE DESCRIPTION                    VALUE
      0     4        (object header)
      4     4        (object header)
      8     4        (object header)
     12     4  int[] DoubleArray.array1
     16     4 long[] DoubleArray.array2
     20     4        (loss due to the next object alignment)
Instance size: 24 bytes (reported by Instrumentation API)
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
不确定您使用了哪种仪器。它还取决于所使用的虚拟机以及内存模型

1) 我的直觉是,存储它的数组使用的内存最小为12字节。但在SingleArray中,只存储一个指针


2) 根据内存型号,指针可能为4或8字节。即使在64位机器上,指针也可能只有32位。看。

嗯,什么?数组引用将占用四个字节;如果您实际在其中放置了一个数组,那么数组头将占用12个字节加上数组的内容。看起来您遇到了填充,对象被四舍五入到8字节的倍数。还不清楚您在什么环境下运行此程序,这非常重要。对象头在32位JVM上使用8字节,在64位JVM上默认使用12字节。@PeterLawrey谢谢,很高兴知道-使用jammIt在32位机器上进行测量,很高兴看到32位JVM没有死机,它仍然被使用。除非您的堆超过32 GB,否则您的引用可能是32位的。i、 e.大多数JVM。
 OFFSET  SIZE  TYPE DESCRIPTION     
      0     4       (object header) 
      4     4       (object header) 
      8     4       (object header) 
     12     4 int[] SingleArray.array1
Instance size: 16 bytes (reported by Instrumentation API)
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
 OFFSET  SIZE   TYPE DESCRIPTION                    VALUE
      0     4        (object header)
      4     4        (object header)
      8     4        (object header)
     12     4  int[] DoubleArray.array1
     16     4 long[] DoubleArray.array2
     20     4        (loss due to the next object alignment)
Instance size: 24 bytes (reported by Instrumentation API)
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total