• JAVA对象头


    #为了防止自己忘记,先记着,之前我一直以为《深入理解JAVA虚拟机》写错了来着。

    一. JAVA对象

    在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header),实例数据(Instance Data)和对齐填充(Padding)。

    也就是说  JAVA对象 = 对象头 + 实例数据 + 对象填充

     二. 对象头

    对象头由两部分组成,一部分用于存储自身的运行时数据,称之为 Mark Word,另外一部分是类型指针,及对象指向它的类元数据的指针。

    对象头 = Mark Word + 类型指针

    (未开启指针压缩的情况下)

    在32位系统中,Mark Word = 4 bytes = 32 bits,对象头 = 8 bytes = 64 bits;

    在64位系统中,Mark Word = 8 bytes = 64 bits ,对象头 = 16 bytes = 128bits;

    三. 实例数据

    http://www.cnblogs.com/magialmoon/p/3757767.html  引用这位大手子的文章

    原生类型(primitive type)的内存占用如下:

    Primitive Type Memory Required(bytes)
    boolean                       1
    byte                             1
    short                            2
    char                             2
    int                                4
    float                             4
    long                             8
    double     8

    reference类型在32位系统上每个占用4bytes, 在64位系统上每个占用8bytes。

    四. 对齐填充

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

  • 相关阅读:
    leetcode231
    leetcode326
    leetcode202
    leetcode121
    leetcode405
    leetcode415
    2019-9-2-win10-uwp-应用转后台清理内存
    2019-9-2-win10-uwp-应用转后台清理内存
    ACM学习心得
    ACM学习心得
  • 原文地址:https://www.cnblogs.com/mezhouyang/p/7475939.html
Copyright © 2020-2023  润新知