G1CollectedHeap クラス内で使用される補助クラス.
ConcurrentG1RefineThread オブジェクトの管理を行う (ConcurrentG1RefineThread オブジェクトは一般に複数存在するが, それらをこのクラスでまとめて管理する).
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp))
class ConcurrentG1Refine: public CHeapObj {
各 G1CollectedHeap オブジェクトの cg1r フィールドに(のみ)格納されている (「各」と言っても1つしかいないが...) (アクセサは G1CollectedHeap::concurrentg1_refine()).
G1CollectedHeap::initialize() 内で(のみ)生成されている.
ConcurrentG1RefineThread オブジェクトは以下の配列に格納されている (その下にあるのは配列の要素数を表すフィールド).
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp))
ConcurrentG1RefineThread** _threads;
int _n_threads;
int _n_worker_threads;
また, filled RS buffers がどこまでたまったら ConcurrentG1RefineThread (や Mutator 自身の refine 処理) を起動させるかは, 以下のフィールドの値で決まる.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp))
/*
* The value of the update buffer queue length falls into one of 3 zones:
* green, yellow, red. If the value is in [0, green) nothing is
* done, the buffers are left unprocessed to enable the caching effect of the
* dirtied cards. In the yellow zone [green, yellow) the concurrent refinement
* threads are gradually activated. In [yellow, red) all threads are
* running. If the length becomes red (max queue length) the mutators start
* processing the buffers.
*
* There are some interesting cases (when G1UseAdaptiveConcRefinement
* is turned off):
* 1) green = yellow = red = 0. In this case the mutator will process all
* buffers. Except for those that are created by the deferred updates
* machinery during a collection.
* 2) green = 0. Means no caching. Can be a good way to minimize the
* amount of time spent updating rsets during a collection.
*/
int _green_zone;
int _yellow_zone;
int _red_zone;
その他に, ConcurrentG1RefineThread を停止させる stop() メソッドや iterate するための threads_do() メソッド等を備えている.
また, hot card を覚えておくためのキャッシュの管理も行っている (ConcurrentG1Refine::use_cache(), ConcurrentG1Refine::cache_insert(), etc).
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.