[英]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 declaration
和Class header
不消耗内存,分配的对象可以。
SingleArray
和DoubleArray
实例占用多少内存? 最后这取决于JVM运行时,但今天这些是最可能的数字:
SingleArray
一个实例:16个字节
array1
的引用 DoubleArray
一个实例:16个字节
array1
的引用 array2
的引用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.