java-对象的内存布局
在java中对象的内存不久分为两种情况,非数组对象和数组对象
数组对象和非数组对象的区别就是数组对象需要额外的空间存储数组的长度length
对象头
对象头又分为MarkWord
和ClassPointer
两部分
- MarkWord:包含一系列的标记位,比如轻量级锁的标记位,偏向锁标记位,gc记录信息等待,在32位系统占4个字节,在64位系统占8个字节
- ClassPointer:用来指向对象对应的class对象的内存地址。在32位系统占4字节,在64位系统占8字节
- Length:只在数组对象中存在,用来记录数组的长度,占用4字节
对象中的实际数据
- interface data:对象实际数据,对象实际数据包括了对象的所有的成员变量,其大小由各个成员变量的大小决定。(不包括静态成员变量,因为在方法区维护的)
对齐填充
- padding:java对象占用空间是8字节对齐的,即所有java对象占用bytes数必须是8的倍数,是因为当我们从磁盘中取一个数据时,不会说我想取一个字节就是一个字节,都是按照一块儿一块儿来取的,这一块大小是8字节,所以为了完整,padding的作用就是补充字节,保证对象是8字节的倍数