Object o = new Object()在内存中的存储布局:
markword:存储锁的信息和分代年龄,占8个字节
class pointer:类型指针,指向对象所在的地址,在jdk8下开启指针压缩,所以只占4个字节(本来是占8个字节)
instance data:实例数据 Object中没有任何数据,所以占0个字节
padding:对齐。当读取对象的时候,根据总线宽度,对象所占的总字节数是8的倍数时读取的效率更高。所以markword+class Pointer + instance data = 12,所以补齐4个字节。
所以,Object o = new Object()总共占16个字节
JOL
openJdk提供了可以查看对象在内存中布局的方法:
pom依赖:
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.10</version>
</dependency>
public class ObjectLayout {
public static void main(String[] args){
Object o = new Object();
System.out.println(ClassLayout.parseInstance(o).toPrintable());
Person person = new Person();
person.setId(1);
person.setName("zhjs");
System.out.println(ClassLayout.parseInstance(person).toPrintable());
synchronized (o){
System.out.println(ClassLayout.parseInstance(o).toPrintable());
}
}
}
注意:上图中椭圆标注的地方,上面那个是没有加锁的,后面那个是加锁的,说明锁的信息是存放在markword中的