jvm对象创建过程和存储布局

java并发内存模型

  • 工作内存为java线程的内存
  • 主内存为JVM内存
  • voliatile 会让每个线程实时读取主内存数据jvm对象创建过程和存储布局

对象的创建过程

  • class loading 加载class到内存汇总
  • class linking
    • verification 校验是否语句满足JVM规范
    • preparation 初始化提供默认值
    • resolution class解析
  • class initializing 提供初始值
  • 申请对象内存
  • 成员变量赋默认值
  • 调用构造方法
    • 成员变量顺序赋初始值
    • 执行构造方法(如果有父类,先加载父类)

前三步是加载class 过程
后面三步是加载对象的过程

对象在内存中的存储布局

普通对象

  • 对象头:markword 8字节
  • ClassPointer指针

    -XX:+UseCompressedClassPointers 为4字节 不开启为8字节 (是否压缩)
    指向引用对象

  • 实例数据

    引用类型:-XX:+UseCompressedOops 为4字节 不开启为8字节 Oops Ordinary Object Pointers
    数据存储值

  • Padding对齐

    8的倍数,便于jvm读取

数组对象

  • 对象头:markword 8
  • ClassPointer指针同上
  • 数组长度:4字节 (比普通对象对一个数组长度)
  • 数组数据
  • 对齐 8的倍数

Object o = new Object() 占多少字节 16

  • markword 8字节
  • ClassPointer 4字节(压缩)
  • Padding 补齐字节为8的倍数 4字节

对象头包含什么

  • 锁定信息 2位
  • 垃圾回收次数

jvm对象创建过程和存储布局

IdentityHashCode的问题

  • 当一个对象计算过identityHashCode之后,不能进入偏向锁状态

https://cloud.tencent.com/developer/article/1480590 https://cloud.tencent.com/developer/article/1484167

https://cloud.tencent.com/developer/article/1485795

https://cloud.tencent.com/developer/article/1482500