zoukankan      html  css  js  c++  java
  • 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字节的倍数,因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。

  • 相关阅读:
    UIView用户事件响应
    登录模块之静态登录
    对C# 中Readonly的再认识
    [Android学习笔记4]四大应用组件之一:Service 上
    修改XPMenu让ToolButton在Down=True时正确显示
    通过程序预览Office文档
    发掘ListBox的潜力(三):显示即时提示(Tips)
    从网络上下载文件的两种方法
    解决窗体闪烁问题的方法
    C/C++中动态链接库的创建和调用
  • 原文地址:https://www.cnblogs.com/mezhouyang/p/7475939.html
Copyright © 2011-2022 走看看