JVM理解(不断更新中)
JVM
-
在JVM中,对象在堆内存中的布局分为三块区域:对象头、实例数据和对齐填充。
-
对象头:采用2个字来存储(如果对象是数组则会分配3个字,多出来的1个字记录的是数组长度)
-
Mark Word 存储对象的hashCode、锁信息或分代年龄或GC标志等信息
-
32位JVM的Mark Word存储结构
重量级锁也就是通常说synchronized的对象锁,其中指针指向的是monitor对象(也称为管程或监视器锁)的起始地址。
-
32位JVM的Mark Word存储结构
- Class Metadata Address 类型指针指向对象的类元数据,JVM通过这个指针确定该对象是哪个类的实例。
-
Mark Word 存储对象的hashCode、锁信息或分代年龄或GC标志等信息
- 实例变量:存放类的属性数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分内存按4字节对齐。
- 填充数据:由于虚拟机要求对象起始地址必须是8字节的整数倍。填充仅仅是为了字节对齐。
-
对象头:采用2个字来存储(如果对象是数组则会分配3个字,多出来的1个字记录的是数组长度)
-
Monitor 对象(也称为管程或监视器锁)
- monitor对象存在于每个Java对象的对象头中(存储的指针的指向),synchronized锁便是通过这种方式获取锁的,也是为什么Java中任意对象可以作为锁的原因,同时也是notify/notifyAll/wait等方法存在于顶级对象Object中的原因