<1>.对象在内存中的存储布局可以分为三块区域:对象头,实例数据和对象填充
其中对象头简单的结构图如下:
实例对象部分是对象真正存储的有效信息。也是在程序代码中所定义的各种类型的字段内容。无论是从父类中继承的还是在子类中定义的,都要记录下来。
第三部分对象填充并不是必然存在,也没有特别的含义,他仅仅起着占位符的的作用。Ex:由于HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说对象的大小必须是8字节的整数倍,因此当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。
<2>.对象的访问定位
创建对象就是为了使用对象,在java程序中需要通过栈上的reference数据来操作堆上的具体对象。访问对象的方式取决于虚拟机而定。目前主流有以下两种。
通过句柄访问
通过直接指针访问对象
这两种对象访问方式各有优势,使用句柄访问的最大好处就是reference中存储的是稳定的句柄地址,在对象被移动的时候,只会改变对象中实例数据的指针,而reference本身不需要改变。
使用直接指针最大的好处就是速度更快,节省了一次指针定位的开销。
下一篇 --OutOfMemoryError异常 堆中为什么分代--- 参考博客:https://blog.csdn.net/ft305977550/article/details/78517372