HotSpot 虚拟机对象
1.对象的创建:
对象的创建涉及到两个问题:
1)内存空间的分配 解决方法:指针碰撞和空闲列表(分别针对内存空间连续和内存空的不连续)
2)分配内存时的线程安全 解决方法:
- 对分配内存空间的动作进行同步处理-其实在虚拟机采用的是CAS配上失败重试保证操作的原子性;
- 把内存分配动作按照线程划分在不同的空间进行,也就是每个线程在Java堆中预先分配一小块儿内存,称作是本地线程分配缓冲TLAB(Thread Local Allocation Buffer)。
2.对象的内存布局
对象在内存中存储的布局可以分为三个区域
- 对象头:对象头分为两部分,
一部分是用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标识、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据官方叫“Mark Word”;
另一部分是类型指针,也就是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。 - 实力数据:对象真正存储的有效信息;
- 对齐填充:并不是必然存在的,也没有特别含义,它仅仅起着占位符的作用。
3. 对象的访问定位:
目前主流的访问方式是使用句柄和直接指针两种。
两种访问方式各有优势:
使用句柄访问的好处是reference中存储的是稳定的句柄地址,在对象被移动的时候只会改变句柄中的实例数据指针,而reference本身不需要修改。
使用直接指针的方式最大的好处就是速度更快,它节省了一次指针定位的时间开销。