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使用直接指针
网友评论