G1GC アルゴリズムを補佐するスレッドクラス(ConcurrentGCThreadクラス). このクラスは, Remembered Set を適切に保つ処理を行う (論文中では "concurrent remembered set thread"). (See: here for details)
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.hpp))
// The G1 Concurrent Refinement Thread (could be several in the future).
class ConcurrentG1RefineThread: public ConcurrentGCThread {
各 ConcurrentG1Refine オブジェクトの _threads フィールドに(のみ)格納されている (「各」と言っても1つしかいないが...)
(正確には, このフィールドは ConcurrentG1RefineThread の配列を格納するフィールド. この中に, 使用される全ての ConcurrentG1RefineThread オブジェクトが格納されている)
ConcurrentG1Refine::ConcurrentG1Refine() 内で(のみ)生成されている (配列のメモリ領域も ConcurrentG1Refine::ConcurrentG1Refine() 内で(のみ)確保されている).
ConcurrentG1RefineThread は, 最初に最大数分だけ生成された後, 仕事の量に応じて動的に稼働数を変える (仕事のないスレッドはブロックする).
これを実現するため, 各 ConcurrentG1RefineThread はそれぞれ個別の Monitor オブジェクトを保持している (0 版目の ConcurrentG1RefineThread だけは, DirtyCardQ_CBL_mon を使用する).
各 ConcurrentG1RefineThread は, worker id が一つ小さい ConcurrentG1RefineThread によって起床される (0 版目の ConcurrentG1RefineThread だけは, write barrier 処理から起床される). (See: here for details)
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp))
// Each thread has its own monitor. The i-th thread is responsible for signalling
// to thread i+1 if the number of buffers in the queue exceeds a threashold for this
// thread. Monitors are also used to wake up the threads during termination.
// The 0th worker in notified by mutator threads and has a special monitor.
// The last worker is used for young gen rset size sampling.
定義されているフィールドは以下の通り.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.hpp))
double _vtime_start; // Initial virtual time.
double _vtime_accum; // Initial virtual time.
int _worker_id;
int _worker_id_offset;
// The refinement threads collection is linked list. A predecessor can activate a successor
// when the number of the rset update buffer crosses a certain threshold. A successor
// would self-deactivate when the number of the buffers falls below the threshold.
bool _active;
ConcurrentG1RefineThread* _next;
Monitor* _monitor;
ConcurrentG1Refine* _cg1r;
int _thread_threshold_step;
// This thread activation threshold
int _threshold;
// This thread deactivation threshold
int _deactivation_threshold;
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.