我正在尝试了解由类中的各种数据成员检测的 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/