ZGC垃圾回收触发机制
所属分类 ZGC
浏览量 1147
ZGC触发逻辑,zDirector.cpp
void ZDirector::run_service() {
// Main loop
while (_metronome.wait_for_tick()) {
sample_allocation_rate();
const GCCause::Cause cause = make_gc_decision();
if (cause != GCCause::_no_gc) {
ZCollectedHeap::heap()->collect(cause);
}
}
}
_metronome.wait_for_tick()
每100ms执行一次make_gc_decision(),决定是否执行ZGC
rule_timer rule_warmup rule_allocation_rate rule_proactive
阻塞内存分配请求触发
当垃圾来不及回收,垃圾将堆占满时,会导致部分线程阻塞
应当避免出现这种触发方式,日志关键字 Allocation Stall
基于分配速率的自适应算法
最主要的GC触发方式,
ZGC根据近期的对象分配速率以及GC时间,计算出当内存占用达到什么阈值时触发下一次GC
ZAllocationSpikeTolerance 参数控制阈值大小,默认2,数值越大,越早触发GC
日志关键字 Allocation Rate
基于固定时间间隔
ZCollectionInterval ,适合应对突增流量场景
流量平稳变化时,自适应算法可能在堆使用率达到95%以上才触发GC
流量突增时,自适应算法触发的时机可能会过晚,导致部分线程阻塞
日志关键字 Timer
主动触发规则
类似于固定间隔规则,但时间间隔不固定,是ZGC自行算出来的,我们的服务因为已经
加了基于固定时间间隔的触发机制,可关闭该规则
-ZProactive 关闭,避免GC频繁 日志关键字 Proactive
预热规则
服务刚启动时出现,一般不需要关注 ,日志关键字 Warmup
外部触发
代码中显式调用System.gc() ,日志关键字 System.gc()
元数据分配触发
元数据区不足时触发,一般不需要关注 ,日志关键字 Metadata GC Threshold
上一篇
下一篇
java GC 进化
CMS G1 ZGC 堆内存区别
ZGC特性简介
busybox简介
Linux ps命令
linux运维常用命令