对象头信息
Java的实例对象、数组对象在内存中的组成包括三部分:对象头Hearder、实例数据、内存填充。
对象头信息主要包括两部分:标记位(MarkWord)和对象指针(Class Pointer),其中标记位占8个字节,对象指针占4个字节。
此外,对于数组对象而言,额外有4个字节代表数组长度。
Java的对象头在对象不同情况下会有不同的表现形式,主要有三种状态:无锁状态、有锁状态、GC标记状态。其中锁状态又分为偏向锁、轻量级锁、重量级锁三类。
标记位和锁
重量级锁
synchronized 底层有一个monitor监视器,会监控持有锁的对象,加锁解锁都由JVM控制
经过javac编译后,会在同步块的前后分别形成MonitorEnter和MonitorExit这两个字节码指令,都需要一个refrence类型的参数来指明要锁定和解锁的对象。
针对重量级锁做了哪些优化?
锁膨胀