JVM(3)--对象内存布局

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Maybeno1314/article/details/88658516

    <1>.对象在内存中的存储布局可以分为三块区域:对象头,实例数据和对象填充

    其中对象头简单的结构图如下:

    

    实例对象部分是对象真正存储的有效信息。也是在程序代码中所定义的各种类型的字段内容。无论是从父类中继承的还是在子类中定义的,都要记录下来。

   第三部分对象填充并不是必然存在,也没有特别的含义,他仅仅起着占位符的的作用。Ex:由于HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说对象的大小必须是8字节的整数倍,因此当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。

    <2>.对象的访问定位

          创建对象就是为了使用对象,在java程序中需要通过栈上的reference数据来操作堆上的具体对象。访问对象的方式取决于虚拟机而定。目前主流有以下两种。

          通过句柄访问

        通过直接指针访问对象

    这两种对象访问方式各有优势,使用句柄访问的最大好处就是reference中存储的是稳定的句柄地址,在对象被移动的时候,只会改变对象中实例数据的指针,而reference本身不需要改变。

    使用直接指针最大的好处就是速度更快,节省了一次指针定位的开销。

    下一篇 --OutOfMemoryError异常          堆中为什么分代--- 参考博客:https://blog.csdn.net/ft305977550/article/details/78517372

猜你喜欢

转载自blog.csdn.net/Maybeno1314/article/details/88658516