天天看点

JVM理解(不断更新中)

JVM

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