• jVM笔记4-对象的结构


    1.对象的结构有:

        1.Header(对象头),其组成主要有两部分:

            1.自身运行时的数据(Mark Word),包括:

                1.哈希值

                2.GC分代年龄。

                3.锁状态标志

                4。线程所持有的锁

                5.偏向线程ID

                6.偏向时间戳

            自身运行时的数据(Mark Word)说占多少多内存呢?其实是根据32位,64位的虚拟机而定的。但是它包含的数据远远超过其本身内存。

            那它是如何做到将这些数据存储的 呢?先看下图:

            

                很明显它是通过内存复用来实现。

              2.类型指针。就是对象指向它的类的元数据的指针。虚拟机通过这个指针来确定这个对象是哪个类的实例。注意并不是所有的虚拟机的实现都保留类型指针。

        2.InstanceData(数据实例):这部分是真正存储对象的有效信息,也是我们接触到的,看到的最多的地方。不管是从父类继承下来的,还是子类定义的,都要记录下来。

        这部分存储的顺序会收到虚拟机的分配策略和字段在java源码中的顺序的影响。HotSpot虚拟机所默认的 分配策略是相同宽度的字段被分配到一起。

        3.Padding(填充):它仅仅相当于占位符。这部分并不是必然存在的,也没有特别的含义,它仅仅相当于占位符。那为什么需要占位符呢?主要是因为HotSpot虚拟机的自动内存管理系统要求

        对象起始地址必须是8个字节的整数倍,也就是说对象的大小必须是八个字节的整数倍,而对象头部分刚好是8个字节的整数倍,而InstanceData如果没有八个字节的整数倍,则要通过填充来

        使它达到。

  • 相关阅读:
    移植Linux2.6.38到Tiny6410_1GNandflash
    【转载】Mini6410启动过程
    【转载】Mini2440启动配置文件说明
    【转载】linux2.6内核initrd机制解析
    第十三章 StringTable
    第十二章 执行引擎
    第十一章 直接内存(Direct Memory)
    第十章 对象的实例化、内存布局与访问定位
    第九章 方法区
    第八章 堆
  • 原文地址:https://www.cnblogs.com/huangjuncong/p/8452877.html
Copyright © 2020-2023  润新知