写点什么

深入解析 JVM-Java 对象头组成

作者:janyxe
  • 2022 年 4 月 17 日
  • 本文字数:743 字

    阅读完需:约 2 分钟

深入解析JVM-Java对象头组成

前言

上一章节带着大家初探 JVM 的类加载机制,以及双亲委派机制,本文主要介绍了 Java 对象头的组成以及详解



一、一个对象如何组成的?

对象在内存中的布局包含:对象头(MarkWord、Klass Pointer)、实例数据、对象填充



  • Mark Word :用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等

  • Klass Pointer :对象指向它的类的元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例

  • 实例属性 :定义类中的成员属性

  • 对齐填充 : 由于 HotSpot 虚拟机的自动内存管理系统要求对象的起始地址必须是 8 字节的整数倍,也就是对象的大小必须是 8 字节的整数倍

二、基本类型占用的字节和位数



三、new 一个对象占用多少字节

public class Demo1 {    public static void main(String[] args) {        LockObject lockObject = new LockObject();        System.out.println(ClassLayout.parseInstance(lockObject).toPrintable());    }
static class LockObject{ int a = 4; long b = 1; boolean c = false; }}
复制代码



根据上面基本类型占用的字节和位数可计算出:


在开启了指针压缩的情况下:


  • 对象头 12 个字节

  • 实例数据 int  a=4 4 个字节,long b=1 8 个字节,boolean c=false 1 个字节

  • 对齐补充 7 个字节。

  • 总共 32 个字节

四、对象内存中 offset 作用


offset:相对于类对象所占内存区域起始位置的偏移

五、对象头详解

  1. 哈希值:31 位的对象标识 hashCode,采用延迟加载技术。它是一个地址,用于栈对堆空间中对象的引用指向

  2. GC 分代年龄(占 4 位):记录幸存者区对象被 GC 之后的年龄 age,一般 age 为 15(阈值为 15 的原因是因为 age 只有 4 位最大就可以将阈值设置 15)

  3. 锁状态标志(占 2 位):记录一些加锁的信息




总结

本文主要介绍了 Java 对象头的组成以及详解

发布于: 刚刚阅读数: 5
用户头像

janyxe

关注

勤能补拙 2020.05.26 加入

程序员一枚,喜欢 云原生、前端、后端开发领域

评论

发布
暂无评论
深入解析JVM-Java对象头组成_Java_janyxe_InfoQ写作平台