我试图理解由类中的各种数据成员检测的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个字节。我很迷惑。我错过了什么?
答案 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 declaration
和Class header
不消耗内存,分配的对象会消耗内存。
SingleArray
和DoubleArray
的实例消耗了多少内存?最后,这取决于JVM运行时,但今天这些是最可能的数字:
SingleArray
的实例:16个字节
array1
DoubleArray
的实例:16个字节
array1
array2