ZGC什麼時候會進行垃圾回收

對ZGC還不怎麼了解的同學,可以先看看這篇文章 傳送門

以往的一些GC算法,比如CMS、G1,均採用分代的思想對堆內存進行劃分,對應的GC行爲也可以分爲Young GC、Old GC 和 FGC。

但是在ZGC算法中,並沒有分代的概念,所以就不存在Young GC、Old GC,所有的GC行爲都是Full GC。

那ZGC的垃圾回收行爲什麼時候會進行?

擼了下源碼,已經定位到觸發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返回一次,意味着每100ms執行一次 make_gc_decision(),決定是否執行ZGC。

make_gc_decision()中提供了4種策略,只要滿足其中1個策略就可以觸發ZGC。

1、rule_timer

第一個策略,從行爲表現上,我把它叫做是週期性GC,默認是不生效的,但是如果配置 -XX:ZCollectionInterval=1(單位是秒),那麼每隔1s,就會執行一次ZGC,太暴力了。

2、rule_warmup

JVM啓動之後,如果一直沒有發生過GC,那麼會在堆內存使用超過10%、20%、30%時,分別觸發一次GC,這樣做是爲了收集一些GC相關的數據,爲後面的條件規則提供數據支撐。

3、rule_allocation_rate

根據對象分配速率決定是否GC。 如果當前的可用堆內存,根據估計出來的對象最大分配速率,很快會被耗盡,則執行一次GC,這種策略一般在qps很高、對象分配很快時會被觸發。

4、rule_proactive

這個策略是積極主動型的。 如果能夠接受因爲GC引起的應用吞吐量下降,那麼就觸發GC,這個策略允許我們降低堆內存,並且在堆內存還有很多剩餘空間時,執行引用處理,具體的條件是: 1、自從上次GC之後,堆的使用量至少漲了10% 2、自從上次GC之後,已經過去5分鐘沒有發生GC

這有助於在對象分配率非常低的應用程序時避免多餘的GC.

這4種都是在還有空閒內存的時候就執行GC的策略,那如果垃圾回收的速度趕不上對象分配的速率,怎麼辦?

這個時候,分配對象的應用線程只能停下來,等待垃圾對象的回收。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章