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

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对象内存布局