G1 GC的更新日志缓冲区如何应对应用突发写操作的影响分析?
- 内容介绍
- 相关推荐
本文共计1266个文字,预计阅读时间需要6分钟。
markdownUpdate Log Buffer 并非 G1 GC 的标准术语——这是一个常见的误解。实际上,想要指的通常是指 Dirty Card Queue(脏卡片队列)。这是 G1 用于暂存跨 Region 写操作记录的线程本地缓冲区。它不被称为日志缓冲区,也不属于 redo log 或 binlog 系统。它与 MySQL 的 log buffer 完全无关。
怎么确认你的应用正被 Dirty Card Queue 背压拖慢
G1 在每次跨 Region 写操作时,通过写屏障(write barrier)把对应内存页(card)标记为 dirty,并追加到当前线程的 Dirty Card Queue。这个队列满时,线程会阻塞等待刷新,直接表现为应用写延迟突增、TPS 下滑、GC 日志中 Update RS 耗时异常。
- 查看 GC 日志里
Update RS(ms)行:若Avg > 10ms或Max > 30ms,基本可判定 RSet 更新已成瓶颈 - 同时观察
Ext Root Scanning(ms)是否同步上涨:说明 GC 线程在等 RSet 刷新完成,进一步拖慢 Mixed GC - 出现大量
GC pause (G1 Evacuation Pause)(mixed)但老年代实际存活率不高:RSet 滞后导致回收集选错
注意:Dirty Card Queue 不是全局共享队列,每个应用线程都有自己的副本;所以高并发写场景下,不是“一个队列满了”,而是“几十个队列几乎同时满”,放大阻塞效应。
本文共计1266个文字,预计阅读时间需要6分钟。
markdownUpdate Log Buffer 并非 G1 GC 的标准术语——这是一个常见的误解。实际上,想要指的通常是指 Dirty Card Queue(脏卡片队列)。这是 G1 用于暂存跨 Region 写操作记录的线程本地缓冲区。它不被称为日志缓冲区,也不属于 redo log 或 binlog 系统。它与 MySQL 的 log buffer 完全无关。
怎么确认你的应用正被 Dirty Card Queue 背压拖慢
G1 在每次跨 Region 写操作时,通过写屏障(write barrier)把对应内存页(card)标记为 dirty,并追加到当前线程的 Dirty Card Queue。这个队列满时,线程会阻塞等待刷新,直接表现为应用写延迟突增、TPS 下滑、GC 日志中 Update RS 耗时异常。
- 查看 GC 日志里
Update RS(ms)行:若Avg > 10ms或Max > 30ms,基本可判定 RSet 更新已成瓶颈 - 同时观察
Ext Root Scanning(ms)是否同步上涨:说明 GC 线程在等 RSet 刷新完成,进一步拖慢 Mixed GC - 出现大量
GC pause (G1 Evacuation Pause)(mixed)但老年代实际存活率不高:RSet 滞后导致回收集选错
注意:Dirty Card Queue 不是全局共享队列,每个应用线程都有自己的副本;所以高并发写场景下,不是“一个队列满了”,而是“几十个队列几乎同时满”,放大阻塞效应。

