Object o = new Object()在内存中的存储布局:

image.png
markword:存储锁的信息和分代年龄,占8个字节
class pointer:类型指针,指向对象所在的地址,在jdk8下开启指针压缩,所以只占4个字节(本来是占8个字节)
image.png
instance data:实例数据 Object中没有任何数据,所以占0个字节
padding:对齐。当读取对象的时候,根据总线宽度,对象所占的总字节数是8的倍数时读取的效率更高。所以markword+class Pointer + instance data = 12,所以补齐4个字节。
所以,Object o = new Object()总共占16个字节

JOL

openJdk提供了可以查看对象在内存中布局的方法:
pom依赖:

  1. <dependency>
  2. <groupId>org.openjdk.jol</groupId>
  3. <artifactId>jol-core</artifactId>
  4. <version>0.10</version>
  5. </dependency>
  1. public class ObjectLayout {
  2. public static void main(String[] args){
  3. Object o = new Object();
  4. System.out.println(ClassLayout.parseInstance(o).toPrintable());
  5. Person person = new Person();
  6. person.setId(1);
  7. person.setName("zhjs");
  8. System.out.println(ClassLayout.parseInstance(person).toPrintable());
  9. synchronized (o){
  10. System.out.println(ClassLayout.parseInstance(o).toPrintable());
  11. }
  12. }
  13. }

image.png
注意:上图中椭圆标注的地方,上面那个是没有加锁的,后面那个是加锁的,说明锁的信息是存放在markword中的