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

标签 java

我正在尝试了解由类中的各种数据成员检测的 Java 类的内存占用情况。我在这篇文章中找到了一些背景 Material :

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并将其应用到您的类(class)中

java -jar jol-cli-0.3.2-full.jar internals -cp bin x.SingleArray

它为 Java HotSpot(TM) 64 位服务器虚拟机(内部版本 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 .

关于java - Java类中成员变量的内存占用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36341551/

相关文章:

java - 在 Netty 中添加对 LLRP 的支持

java - 我想从下拉列表中显示的字符串中获取子字符串

java - 如何解决 install4j 中的 java.lang.NoClassDefFoundError

java - 我从哪里开始编写/使用 3D 物理模拟引擎?

java - 获取值 (JSoup)

java - jenkins 无法执行目标 org.apache.maven.plugins :maven-release-plugin:2. 3.2:prepare (default-cli)

java - Jersey 响应日志记录过滤器,不包括 GET 的响应主体

Java简单程序不允许接受用户输入

java - Java ClassLoader 是否加载内部类?

java - 为 JTable 中的不同单元格添加不同的 JComboBox