Java对象的内存布局是怎么样的?
2 个回答
浪漫的灵魂从不向平淡的日子妥协。宁风致对象在堆内存中的存储布局分为以下三部分: 1. **对象头**: - 包含两部分数据:`MarkWord` 和类型指针。 - **MarkWord**:用于存储对象的哈希码、GC 分代年龄、锁状态标志、偏向锁的线程 ID 等信息。 - **类型指针**:指向对象所属类的元数据。如果对象是数组,还会包含记录数组长度的额外字段。 2. **实例数据**: - 存储对象中定义的字段(实例变量)的具体值,包括父类和子类的所有字段信息。 3. **对齐填充**: - 用于保证对象的起始地址是 8 字节的整数倍,符合 HotSpot 虚拟机的内存对齐要求。发布于 2024-04-06 17:32 •IP属地 河北举报评论收藏
慢慢理解世界,慢慢更新自己。java蚂蚁对象在内存中存储布局主要分为对象头,实例数据和对齐填充三部分。 这是网上看到的一张图:  ### 对象头 对象头主要包含对象自身的运行时数据(也就是图中Mark Word),类型指针(图中的Class Pointer,指向对象所属的类)。如果对象是数组,还需要包含数组长度(否则无法确定数组对象的大小)。 Mark Word:存储对象自身的运行时数据,例如hashCode,GC分代年龄,锁状态标志,线程持有的锁等等。在32位系统占4字节,在64位系统中占8字节。  **Class Pointer**:用来指向对象对应的Class对象(其对应的元数据对象)的内存地址。在开启了指针压缩时,占4字节。(默认是开启的) **Length**:如果是数组对象,还有一个保存数组长度的空间,占4个字节。 ### 实例数据 保存对象的非静态成员变量数据。实例数据存储的是真正的有效数据,即各个字段的值。无论是子类中定义的,还是从父类继承下来的都需要记录。这部分数据的存储顺序受到虚拟机的分配策略以及字段在类中的定义顺序的影响。 ### 对齐填充 因为HotSpot虚拟机的自动内存管理系统要求对象起始地址是8字节的整数倍,所以任何对象的大小必须是8字节的整数倍,而对象头部分一般是8字节的倍数,如果实力数据部分不是8字节的整数倍,需要对齐填充来补全。编辑于 2022-02-23 20:14 •IP属地 江苏举报评论收藏
公众号进入网站体验更佳

