Java虚拟机(HotSpot)对象

来源:互联网 发布:两个矩阵的协方差公式 编辑:程序博客网 时间:2024/05/16 06:49
对象内存布局
在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。
对象头包括两部分信息,第一部分用于存储对象自身的运行时数据,如HashCode、GC分代年龄、锁状态标志、线程持有锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的虚拟机中分别为32bit和64bit,官方称它为“mark word”。对象头的另外一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
实例数据是对象真正存储的有效信息,也是程序代码中所定义的各种类型的字段内容。
对齐填充并不是必然存在的,它仅仅起着占位符的作用。对象的大小必须是8字节的整数倍,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。

对象访问定位
建立对象时为了使用对象,java程序需要通过栈上的reference数据来操作对象的具体对象。目前主流的访问对象的方式有使用句柄和直接指针两种。
通过句柄访问对象:java堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息。(具有写优势。如垃圾回收后对象移动时只会改变句柄中的实例数据指针,而reference本身不需要修改)


通过直接指针访问对象(HotSpot采用的方式):java堆对象的布局中就必须考虑如何防止访问类型数据的相关信息,而reference中存放的直接就是对象地址。(具有读优势。节省了一次指针定位的时间开销)

0 0
原创粉丝点击