对象的创建
一、对象的创建过程
加载类->申请对象内存->成员变量赋默认值->调用构造方法<init>,包含赋值初始值,执行构造方法语句
二、对象的布局(64位)
普通对象
- 对象头:markword 8
- ClassPointer指针:-XX:+UseCompressedClassPointers 为4字节 不开启为8字节
- 实例数据 引用类型:-XX:+UseCompressedOops 为4字节 不开启为8字节 Oops Ordinary Object Pointers
- Padding对齐,8的倍数
数组对象
- 对象头:markword 8
- ClassPointer指针同上
- 数组长度:4字节
- 数组数据
- 对齐 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: 保存偏向时间戳
四、对象的定位
- 句柄池
- 直接指针(Hotspot使用)
五、对象的分配

栈上分配:进行逃逸分析(保证线程私有)和标量替换后(转换成本地变量),直接分配到栈上。
TLAB分配:占用eden去空间,为每个线程分配一块儿TLAB区域,避免申请空间时的资源竞争,加速对象分配。虚拟机会在内部维护一个叫refill_waste的值,当请求对象大于refill_waste时,会选择在堆中分配,反之,则会废弃当前TLAB,新建TLAB来分配新对象。默认情况下,TLAB和refill_waste都是会在运行时不断调整的,使系统的运行状态达到最优。
六、JavaAgent
通过Agent可以截获load到内存中的class文件

浙公网安备 33010602011771号