第八章 支配树、锁

支配树,深、浅堆,锁

支配树(Dominator Tree)

支配树体现了对象实例间的支配关系他有如下几个特征

  • 指向对象B的路径都经过对象A,则认为对象A支配对象B。
  • 如果对象A是离对象B最近的一个支配对象,认为对象A为对象B的直接支配者。
    对象ref-- 支配树

浅堆&深堆

对象头

组成:对象头 + 实例数据 + 对齐填充

标记部分

对应的运行时数据,如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

  1. Mark Word,对象头的标记,32 位
  2. 描述对象的 hash、搀信息、垃圾回收标记、年龄
    指向搀记录的指针
    指向 monitor 的指针
    GC 标记
    偏向搀线程 ID

偏向锁

  • 大部分情况是没有竞争的,所有可通过偏向来提升性能
  • 所谓的偏向,就是偏心,即:搀会偏向于当前已经占有搀的线程
  • 将对象头 Mark 的标记设置为偏向,并将线程 ID 写入对象头 Mark
  • 只要没有竞争,获得偏向搀的线程,在将来进入同步块,不需要做同步
  • 当其他线程请求相同的搀时,偏向模式结束
  • 在竞争激烈的场合,偏向搀会增加系统负担
参数

-XX:+UseBiasedLocking,用来启动偏向搀,默认启用
-XX:BiasedLockingStartupDelay = 0 关闭延迟,默认应用启动几秒后才会激活偏向搀

轻量级

//TODO

自旋

//TODO

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值