[JVM笔记].对象的实例化

292 阅读1分钟
  1. 判断对象是否已经加载、链接、初始化:是否在常量池中定位到该类的符号引用,并检查是否被加载、解析、初始化,
  2. 为对象分配内存:首先计算对象占用空间大小,然后在堆中划分一块内存给新对象
  1. 处理并发安全问题:创建对象是一个比较频繁的过程,需要解决并发问题。
  • CAS失败重试、区域加锁;保证指针更新具有原子性
  • (TLAB ,Thread Local Allocation Buffer) :把内存分配的动作按照线程划分在不同的空间中进行
  1. 初始化分配到的空间:比如int=0,boolean=0
  2. 设置对象的对象头:将对象的所属类(即类的元数据信息)、对象的HashCode和对象的GC信息、锁信息等数据存储在对象的对象头中
  1. 执行init方法进行初始化(赋初值)

对象的内存布局

内部结构:对象头、实例数据、对齐填充(8的倍数)

实例数据对象真正存储的有效信息,包括程序代码中定义的各种类型的字段(包括从父类继承下来的和本身拥有的字段) 规则:

  1. 相同宽度的字段总被分配在一起
  2. 父类中定义的变量会出现在子类之前
  1. 如果CompactFields参数为true(默认为true),子类的窄变量可能插入到父类变量的空隙