繁体   English   中英

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

[英]Memory footprint of member variables in Java class

我试图理解由类中的各种数据成员检测的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个字节。 我很迷惑。 我错过了什么?

好吧,无论博客条目说什么,眼见为实。 我从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位。 请参阅压缩的哎呀

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

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

SingleArray一个实例:16个字节

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

DoubleArray一个实例:16个字节

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM