-
普通对象
4或8字节(MarkWord)+4或8字节(klass Reference)+实例数据长度+ 0填充(Padding) -
数组对象
4或8字节(MarkWord)+4或8字节(klass Reference)+4字节(ArrayLength)+实例数据长度+0填充(Padding) -
其它说明:
对象头(MarkWord)在32位JVM中为4字节,在64位JVM中为8字节
为了节约空间,使用了指针压缩技术:
JDK6开始对类型指针(Reference)进行压缩,压缩前8字节,压缩后4字节
参数 -XX:+UseCompressedOops
JDK8开始新增元数据空间metaSpace,于是新增参数来控制指针压缩:
-XX:+UseCompressedClassPointers(指针压缩开关,堆内存>=32G时,自动关闭)
-XX:CompressedClassSpaceSize (Reference指向的类元数据空间大小,默认1G,上限32G)
数据填充(Padding)为保证对象大小为8的整数倍的数据填充,使数据对齐 -
常用数据类型大小
数据类型 | 占用空间(byte) |
---|---|
byte | 1 |
short | 2 |
int | 4 |
long | 8 |
char | 2 |
float | 4 |
double | 8 |
boolean | 1或4 ,计算大小时为1,判断真假时为4(底层为int常量0,1) |
Object(存储的是引用指针) | 由计算机位数和是否指针压缩决定 4或8 字节 |