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中的
