JVM对象的创建与访问

来源:互联网 发布:淘宝倒闭是必然 编辑:程序博客网 时间:2024/06/06 18:33
对象创建的两种方法:
指针碰撞:
指针碰撞的前提条件是java堆内存是绝对规整的,所用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,分配内存就是将指针想空闲区域移动一个与对象内存相等的区域。
空闲列表:
虚拟机维护一个列表,记录那些内存是可用的,在分配的时候找到一块大小足够用的内存分配给对象。

采用哪种内存分配方式创建对象取决于Java堆内存是否规整。


对象的布局与访问:
对象在内存中的存储可以分成3块区域,对象头,实例数据,对齐填充。
HotSpot虚拟机的对象头包含两部分信息,第一部分用于存储对象自身的运行时数据,如哈希码、GC分代年龄,锁状态标志、线程持有锁,偏向线程ID,偏向时间戳等,这部分数据在32位和64位虚拟机中分别为32bit和64bit

对象访问的两种方式:
句柄访问:
Java堆中会划出一块内存作为句柄池,reference中存储的是对象句柄的地址,而句柄包括了对象实例数据与类型数据的具体地址信息。
指针访问:
Java堆中的reference中存储的是对象的地址。

两种访问方式的对比:
使用句柄访问在reference中稳定存储对象句柄地址,在对象被移动或被回收时只会改变句柄中的实例数据指针,reference本身不需要修改
使用直接指针访问节省了一次指针定位的开销,提高访问速度。
HotSpot使用直接指针访问的方式访问对象。
0 0