zoukankan      html  css  js  c++  java
  • 对象的内存布局

    对象的内存布局

    在HotSpot虚拟机中,对象在堆内存中的存储布局可以划分为三个部分:对象头Header、实例数据Instance Data和对齐填充Padding

    对象头

    HotSpot虚拟机的对象头有两类信息:

    1. 对象自身的运行时数据

    2. 类型指针

    • 对象自身的运行时数据

      • 哈希码、GC分代信息、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等

      • 在32位和64位的虚拟机中分别位32比特和64比特,官方称为“Mark Word”

    • Mark Word被设计成有着动态定义的数据结构,以便在极小的空间内存储尽量多的数据,根据对象的状态复用自己的存储空间

    • 类型指针

      • 即对象指向它的类型元数据的指针,java虚拟机通过这个指针确定该对象是哪个类的实例,确定java对象的大小

      • 如果是数组,在对象头中还需要存储记录数组长度的数据

    实例数据

    实例数据部分是对象真正存储的有效信息,即在程序代码中定义的各种类型字段内容。包括从父类继承的。

    • 存储顺序受到虚拟机分配策略参数:-XX:FieldsAllocationStyle和字段在java源码中定义顺序的影响。

      • HotSpot虚拟机的默认分配顺序是:longs/double、ints、shorts/chars、bytes/booleans、oops(Ordinary Object Pointers);

      • 相同宽度的字段总是被分配到一起存放,满足这个的前提下,在父类中定义的变量会出现在子类之前;

      • 如果HotSpot虚拟机的-XX:CompactFields参数是true,那子类中较窄的变量也允许插入父类变量的空隙,以节省空间。

    对齐填充

    这并不是必然存在的,仅仅起着占位符的作用;

    HotSpot虚拟机的自动内存管理系统要求对象的起始地址必须是8字节的整数倍,也就是说任何对象的大小必须是8字节的整数倍。对象头已经是8的倍数,如果实例数据不是8的倍数,需要对齐填充。

  • 相关阅读:
    C#的扩展方法解析
    C#的Process类调用第三方插件实现PDF文件转SWF文件
    DotNet程序配置文件
    C#中的委托解析
    DotNet生成随机数的一些方法
    好久没玩laravel了,今天玩下Laravel项目迁移步骤
    关于WIN7下IE8IE7浏览器无法安装微信支付商户证书的解决方案
    dedecms5.7文章页替换掉特定标志的图片链接
    原生PHP和MYSQL练习登陆验证和查询数据到表格
    我眼中的如何成为一名合格的PHP高级开发工程师
  • 原文地址:https://www.cnblogs.com/learnjavajava/p/14505801.html
Copyright © 2011-2022 走看看