对象的创建

一、对象的创建过程

加载类->申请对象内存->成员变量赋默认值->调用构造方法<init>,包含赋值初始值,执行构造方法语句

二、对象的布局(64位)

  普通对象

  1. 对象头:markword 8
  2. ClassPointer指针:-XX:+UseCompressedClassPointers 为4字节 不开启为8字节
  3. 实例数据 引用类型:-XX:+UseCompressedOops 为4字节 不开启为8字节 Oops Ordinary Object Pointers
  4. Padding对齐,8的倍数

 

  数组对象

 

  1. 对象头:markword 8
  2. ClassPointer指针同上
  3. 数组长度:4字节
  4. 数组数据
  5. 对齐 8的倍数

三、对象头

32 bits:
--------
hash:25 ------------>| age:4 biased_lock:1 lock:2 (normal object)
JavaThread*:23 epoch:2 age:4 biased_lock:1 lock:2 (biased object)
size:32 ------------------------------------------>| (CMS free block)
PromotedObject*:29 ---------->| promo_bits:3 ----->| (CMS promoted object)

64 bits:
--------
unused:25 hash:31 -->| unused:1 age:4 biased_lock:1 lock:2 (normal object)
JavaThread*:54 epoch:2 unused:1 age:4 biased_lock:1 lock:2 (biased object)
PromotedObject*:61 --------------------->| promo_bits:3 ----->| (CMS promoted object)
size:64 ----------------------------------------------------->| (CMS free block)

unused:25 hash:31 -->| cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && normal object)
JavaThread*:54 epoch:2 cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && biased object)
narrowOop:32 unused:24 cms_free:1 unused:4 promo_bits:3 ----->| (COOPs && CMS promoted object)
unused:21 size:35 -->| cms_free:1 unused:7 ------------------>| (COOPs && CMS free block)

  • hash: 保存对象的哈希码

  • age: 保存对象的分代年龄

  • biased_lock: 偏向锁标识位

  • lock: 锁状态标识位

  • JavaThread*: 保存持有偏向锁的线程ID

  • epoch: 保存偏向时间戳

四、对象的定位

  1. 句柄池
  2. 直接指针(Hotspot使用)

五、对象的分配

  

栈上分配:进行逃逸分析(保证线程私有)和标量替换后(转换成本地变量),直接分配到栈上。

TLAB分配:占用eden去空间,为每个线程分配一块儿TLAB区域,避免申请空间时的资源竞争,加速对象分配。虚拟机会在内部维护一个叫refill_waste的值,当请求对象大于refill_waste时,会选择在堆中分配,反之,则会废弃当前TLAB,新建TLAB来分配新对象。默认情况下,TLAB和refill_waste都是会在运行时不断调整的,使系统的运行状态达到最优。

 

六、JavaAgent

通过Agent可以截获load到内存中的class文件

posted @ 2020-09-06 21:08  kylinmac  阅读(152)  评论(0)    收藏  举报