JVM锁晋升的过程

  1. new Object,此时对象内存中锁标志位中为00
  2. 对象第一次被访问时,对象内存中锁标志为101,表示锁晋升为偏量级锁,同时对象内存中存储调用对象的线程id
  3. 对象被另外一个线程同时访问,撤销偏量级锁,升级为轻量级锁(也叫无锁、自旋锁),锁标志位为00,两个线程通过CAS来给对象设置Lock Record指针,能设置成功则表示锁抢到,另外线程自旋等待
  4. 自旋达到一定程度(默认自旋10次),锁升级为重量级锁,锁标志位10,从系统中申请锁

Java锁晋升

Java对象的结构

Java对象内存结构

查看Java对象内存布局

引入openjdk的jol依赖

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core -->
<dependency>
    <groupId>org.openjdk.jol</groupId>
    <artifactId>jol-core</artifactId>
    <version>0.13</version>
</dependency>

打印对象内存布局

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import org.openjdk.jol.info.ClassLayout;
import org.openjdk.jol.vm.VM;

/**
 * java 对象内存分布
 */

class A{
    long i;
}

public class MemoryLayoutTest {
    public static void main(String[] args){
        System.out.println(VM.current().details());
        System.out.println(ClassLayout.parseClass(A.class).toPrintable());
    }
}

资料来源

java对象在内存中的结构(HotSpot虚拟机) 聊聊java对象内存布局