虚拟机对象探秘

1.对象创建

   对象创建的方式有两种,一种是指针碰撞(Bump the Pointer),一种是空闲列表(Free List)。

        (1)选用哪种方法由Java堆是否规整决定,java堆是否规整又由垃圾收集器是否自带压缩整理功能决定。因此,Serial,ParNew等带Compact过程的收集器时,系统采用分配的算法是指针碰撞,而使用CMS这种Mark-Sweep算法收集器,采用空闲列表。

       (2) 在分配内存的时候,防止并发,有两种解决方法,一种是同步处理-CAS,一种是本地线程分配缓冲(Thread Local Allocation Buffer ,TLAB)

2.对象的内存布局

   对象的布局可分为3个区域:对象头(Head)实例数据,和对齐填充

   对象头:

    (1) 对象头分两部分,第一部分用于存储对象自身的运行时数据,如哈希吗,GC分代年龄,锁状态,线程持有锁,偏向线程ID,偏向时间戳,这部分数据长度在32位和64位中分别为32bit和64bit,官方称他为Mark Word。

    (2) 对象头的另外一部分是类型指针,即对象指向他的元数据的指针,虚拟机通常通过这个指针来确定对 象是哪个类的示例。

    (3) 如果对象是一个数据,那么还必须有一块用于记录数组长度

  实例数据: 

  实例数据部分是对象真正存储的有效信息,也是程序代码中多定义的各种类型的字段内容

  对齐填充:

  这个并不是必然存在的,也没有特别的含义

3.对象的访问

   对象的访问有两种,一种是使用句柄,一种是使用直接指针访问,HotSpot使用直接指针

你可能感兴趣的:(虚拟机对象探秘)