对象内存布局

朱雀 2023-01-23 11:54 165阅读 0赞

一 对象内存布局

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoZW5ncWl1bWluZw_size_16_color_FFFFFF_t_70

二 对象头

对象头包含了两部分:运行时元数据(Mark Word)和 类型指针。

如果是数组,还需要记录数组的长度。

1 运行时元数据

  • 哈希值(HashCode)
  • GC分代年龄
  • 锁状态标志
  • 线程持有的锁
  • 偏向线程ID
  • 偏向时间戳

2 类型指针

指向类元数据 InstanceClass,确定该对象所属的类型。指向的其实是方法区中存放的类元信息。

三 实例数据(Instance Data)

四 对齐填充

不是必须的,也没有特别的含义,仅仅起到占位符的作用。

五 小结

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoZW5ncWl1bWluZw_size_16_color_FFFFFF_t_70 1

六 实战

1 代码

  1. /**
  2. * 测试对象实例化的过程
  3. * ① 加载类元信息
  4. * ② 为对象分配内存
  5. * ③ 处理并发问题
  6. * ④ 属性的默认初始化(零值初始化)
  7. * ⑤ 设置对象头的信息
  8. * ⑥ 属性的显式初始化、代码块中初始化、构造器中初始化
  9. *
  10. * 给对象的属性赋值的操作:
  11. * ① 属性的默认初始化
  12. * ② 显式初始化 / ③ 代码块中初始化 这两个按在代码中出现的顺序进行初始化
  13. * ④ 构造器中初始化
  14. */
  15. public class Customer{
  16. // 占4个字节,显式初始化
  17. int id = 1001; // 它的默认初始化是 0
  18. // 引用占4个字节
  19. String name; // 它的默认初始化是 null
  20. // 引用占4个字节
  21. Account acct; // 它的默认初始化是 null
  22. {
  23. // 代码块中初始化
  24. name = "匿名客户";
  25. }
  26. public Customer(){
  27. acct = new Account();
  28. }
  29. }
  30. class Account{
  31. }
  32. public class CustomerTest {
  33. public static void main(String[] args) {
  34. Customer cust = new Customer();
  35. }
  36. }

2 图解

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoZW5ncWl1bWluZw_size_16_color_FFFFFF_t_70 2

发表评论

表情:
评论列表 (有 0 条评论,165人围观)

还没有评论,来说两句吧...

相关阅读

    相关 对象内存布局

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

    相关 对象内存布局

    HotSpot虚拟机的对象头包括两部分信息,第一部分用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持 有的锁、偏向线程ID、...