美文网首页
对象的内存布局

对象的内存布局

作者: 将军令 | 来源:发表于2017-10-31 10:48 被阅读0次
    Java对象的内存布局

    1、对象头:

    Mark Word:对象自身运行数据(哈希码、GC分代年龄、缩状态标志、线程持有的锁、偏向线程ID、偏向时间戳等)。

    类型指针:对象指向它的类的元数据指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。

    2、实例数据:

    实例数据部分是对象真正存储的有效信息,也是在程序代码中所定义的各种类型字段的内容。无论是从父类继承下来的还是子类中定义的,都需要记录下来。这部分的存储顺序会受到虚拟机分配策略参数(FieldsAllocationStyle)和字段在Java源码中定义顺序的影响。HotSpot虚拟机默认的分配策略为longs/doubles、ints、shorts/chars、bytes/booleans、oops(Ordinary Object Pointers),从分配策略中可以看出,相同宽度的字段总是被分配到一起。在满足这个前提条件的情况下,在父类中定义的变量会出现在子类之前。如果CompactFields参数设置为true,那么子类之中较窄的变量也可能会插入到父类变量的空隙之中。

    3、对齐填充:

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

    摘自 《深入理解Java虚拟机》

    相关文章

      网友评论

          本文标题:对象的内存布局

          本文链接:https://www.haomeiwen.com/subject/nenvpxtx.html