支配树,深、浅堆,锁
支配树(Dominator Tree)
支配树体现了对象实例间的支配关系他有如下几个特征
- 指向对象B的路径都经过对象A,则认为对象A支配对象B。
- 如果对象A是离对象B最近的一个支配对象,认为对象A为对象B的直接支配者。
浅堆&深堆
对象头
组成:对象头 + 实例数据 + 对齐填充
标记部分
对应的运行时数据,如hashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。这部分大小在32位机器上为4byte,64位机器上为8byte
原始对象引用
原始对象引用就是对象的指针,通过这个指针找到对象的实例,该数据可以压缩。这部分大小在32位机器上为4byte,在64位机器上为8byte,如果开启了压缩(UseCompressedOops),大小为4byte。jdk8默认开启压缩
一个对象头的大小 = 标记部分(8byte) + 原始对象引用(未压缩:8byte/压缩:4byte)=未压缩:16byte/压缩:12byte。
实例数据
原始数据大小
对象引用大小为32位 4byte,64位8byte(开启压缩后为4byte)
对齐填充
在C语言中,在结构体定义经常会考虑到内存对齐这样可以提供内存的利用率。
对齐填充说的是任何对象都用8byte来对齐,所以对象的大小为8的整数倍。
所以一个没有任何参数的控对象,对象大小为16byte。
浅堆
浅堆大小为对象本身的大小,浅堆大小 = 对象头 + 实例数据 + 对齐填充
深堆
深堆大小是对象所涉及的所有对象的大小之和。
保留内存
保留内存是指只能通过该对象访问的对象浅堆之和。
锁
对象头Mark
- Mark Word,对象头的标记,32 位
- 描述对象的 hash、搀信息、垃圾回收标记、年龄
指向搀记录的指针
指向 monitor 的指针
GC 标记
偏向搀线程 ID
偏向锁
- 大部分情况是没有竞争的,所有可通过偏向来提升性能
- 所谓的偏向,就是偏心,即:搀会偏向于当前已经占有搀的线程
- 将对象头 Mark 的标记设置为偏向,并将线程 ID 写入对象头 Mark
- 只要没有竞争,获得偏向搀的线程,在将来进入同步块,不需要做同步
- 当其他线程请求相同的搀时,偏向模式结束
- 在竞争激烈的场合,偏向搀会增加系统负担
参数
-XX:+UseBiasedLocking,用来启动偏向搀,默认启用
-XX:BiasedLockingStartupDelay = 0 关闭延迟,默认应用启动几秒后才会激活偏向搀
轻量级
//TODO
自旋
//TODO