对象在内存中的布局
对象在内存中分为四部分:markword,类型指针klasspointer,实例数据(instance_data),对齐填充(padding)。
-
markword,64位虚拟机中为8字节,32位长度为4字节
markword中包含锁信息,hashcode值GC年龄-
锁信息
初始化时,该内容为空,上锁后赋值,锁等级越高,数据量越大 -
hashcode
在对象第一次hash操作时存储进去,后续获取的hashcode值不会变化 -
GC年龄
关系到垃圾回收,由伊甸区,到生存区1,到生存区2,到永久区。年龄随着存货次数增大,直至到一定年龄,转到永久区
-
-
类型指针
指向生成该对象的类在方法区的地址,开启指针压缩为4字节,不开启为8字节
-实例数据
该对象内对象的大小。例如boolean占1字节,byte1字节,int4字节,String 4字节(指针压缩,不压缩为8字节)。值得注意的是,基础数据类型是按该类型的长度来计算,引用类型存储的是地址,大小一致。 -
对齐填充(padding)
由于java对象时8字节对齐的,内存分配时需要保证对象的大小是8的整数倍,所以需要最后的部分补足长度。例如如果一个对象实际大小为17字节,那么就需要补足到20字节,填充的大小就为3字节。如果一个对象长度为16字节,那么在能正好整除8的情况下,就不需要补足,这时填充的大小为0字节。