Java虚拟机——Hotspot虚拟机对象探秘

  • 来深入探讨一下HotSpot虚拟机在Java堆中对象分配、布局和访问的全过程。

2.3.1 对象的创建

  • 在虚拟机中对象的创建过程,这里讨论的是普通的Java对象,不包括数组和Class对象等。
    Java虚拟机——Hotspot虚拟机对象探秘_第1张图片
  • Java堆是否规整又由所采用的垃圾收集器是否带有空间压缩整理能力决定的。
  1. 当使用Serial、ParNew等带压缩整理过程的收集器时,系统采用的分配算法是指针碰撞
  2. 当使用CMS这种基于清除(Sweep)算法的收集器时,理论上采用较为复杂的空闲列表来分配内存。
  • 对象创建在虚拟机中很频繁,但是修改指针在并发情况下不是线程安全的。
  1. 方案一:分配内存空间的动作进行同步处理(实际上虚拟机采用CAS配上失败重试的方式来保证更新操作的原子性)
  2. 方案二:让每个线程在Java堆中预先分配一小块内存,称为本地缓冲区中分配,只有本地缓冲区用完了,分配新的缓存区时才需要同步锁定

2.3.2 对象的内存布局

  • HotSpot虚拟机中,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)
    Java虚拟机——Hotspot虚拟机对象探秘_第2张图片
  • 实例数据部分
  • 这部分是对象真正存储的有效信息,及我们在程序代码里面所定义各种类型的字段内容。(无论是从父类中继承下来,还是子类定义的字段都必须记录)
  • 这部分的存储顺序会受到 虚拟机分配策略参数 和 字段在Java源码中定义顺序的影响。
    Java虚拟机——Hotspot虚拟机对象探秘_第3张图片
  • 对齐填充
  • 它仅仅起着占位符的作用
  • HotSpot虚拟机的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说就是任何对象的大小都必须是8字节的整数倍。
  • 对象头已经被设置成8字节倍数,如果对象实例数据部分没有对齐的话,就会通过对齐填充来补全。

2.3.3 对象的访问定位

  • 我们Java程序会通过栈上的reference数据操作堆上的具体对象。
  • reference类型在*里面只规定了它是一个指向对象的引用,并没有定义这个引用应该通过什么方式去定位、访问到堆中对象的具体位置。
  • 所以对象访问方式也是虚拟机实现而定的。
    Java虚拟机——Hotspot虚拟机对象探秘_第4张图片

你可能感兴趣的:(java,jvm,开发语言)