jvm 内存管理-hotspot虚拟机对象内存布局和访问定位

内存布局

在hotspot虚拟机中,对象在内存存储布局分为3块:对象头,实例数据,对齐填充

对象头包括两部分信息:

  • 存储对象自身的运行时数据:哈希码,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳
  • 类型指针:对象指向类元数据的指针,虚拟机通过该指针确定对象是哪个类的实例。
  • 如果是数据,对象头还需有一块记录数组长度的内存(普通java对象可通过元数据确定对象大小,数组不行)

    实例数据部分:存储真正的有效信息,程序代码所定义的各种类型的字段内容,包括父类继承下来的和子类定义的,
  • 对齐填充并不是必须存在,占位符作用,对象的大小必须是8字节的整数倍

访问定位

建立对象是为了访问对象,java通过栈上的reference数据来操作堆上的数据,目前主流访问方式有两种

句柄访问:reference存储对象的句柄地址,java堆划分一部分内存作为句柄池,句柄包括对象实例和类型数据各自的地址信息。

优点:对象移动(GC时对象移动频繁)只改变句柄示例数据指针,reference不需要改变

指针访问:reference存储对象指针

优点:节省一次指针定位的时间,速度更快,hotspot使用这个方式

本文内容主要是学习周志明老师的《深入理解Java虚拟机》一书的学习笔记,仅作学习巩固整理知识点使用,在此感谢周老师。

扫描二维码关注公众号,回复: 2374962 查看本文章

猜你喜欢

转载自blog.csdn.net/ghostwuxiao/article/details/81071069