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如果没有八个字节的整数倍,则要通过填充来

    使它达到。

posted @ 2018-02-18 16:22  妮蔻  阅读(...)  评论(...编辑  收藏