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

时间:2016-03-31 19:00:57

标签: java

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

http://java-performance.info/overview-of-memory-saving-techniques-java/

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

public class SingleArray {
    int[] array1;
}

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

public class DoubleArray {
    int[] array1;
    long[] array2;
}

但是DoubleArray类型的对象似乎也消耗了24个字节。我很迷惑。我错过了什么?

2 个答案:

答案 0 :(得分:5)

嗯,无论博客文章说什么,眼见为实。我从http://openjdk.java.net/projects/code-tools/jol/下载了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(版本25.66-b17,混合模式)上为SingleArray提供以下输出:

 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

对于DoubleArray:

 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

不确定您使用的是哪种仪器。它还取决于使用的VM以及内存模型。

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

2)根据内存模型,指针可能是4或8个字节。即使在64位机器上,指针也可能只有32位。请参阅Compressed Oops

答案 1 :(得分:1)

要从更正开始,array declarationClass header不消耗内存,分配的对象会消耗内存。

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

SingleArray的实例:16个字节

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

DoubleArray的实例:16个字节

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