これらは, Garbage Collection 処理用の補助クラス. より具体的に言うと, JavaThread の処理と並行して(concurrentに) GC 処理を行うためのクラス (See: here for details).
JavaThread (Mutator) と並行して GC 処理を行うための並行スレッドクラス (の基底クラス) (See: here for details).
concurrent な GC 処理を行うスレッドは ConcurrentGCThread のサブクラスとして実装される.
((cite: hotspot/src/share/vm/gc_implementation/shared/concurrentGCThread.hpp))
class ConcurrentGCThread: public NamedThread {
なお, このクラス自体は abstract class であり, 実際に使われるのは以下のサブクラス.
CMS 用の concurrent marking 処理を行うスレッド
G1GC 用の concurrent marking 処理を行うスレッド
G1GC 用の refine 処理 (Remembered Set を適切に保つ処理) を行うスレッド
See: here for details
複数の ConcurrentGCThread 間で同期を取るためのクラス.
((cite: hotspot/src/share/vm/gc_implementation/shared/concurrentGCThread.hpp))
// A SuspendibleThreadSet is (obviously) a set of threads that can be
// suspended. A thread can join and later leave the set, and periodically
// yield. If some thread (not in the set) requests, via suspend_all, that
// the threads be suspended, then the requesting thread is blocked until
// all the threads in the set have yielded or left the set. (Threads may
// not enter the set when an attempted suspension is in progress.) The
// suspending thread later calls resume_all, allowing the suspended threads
// to continue.
class SuspendibleThreadSet {
これにより, 呼び出したスレッドがその SuspendibleThreadSet オブジェクトに登録される.
(なお登録後にsuspend 対象から外れたくなったら, SuspendibleThreadSet::leave() を呼び出せばよい)
(呼び出したスレッドは, その SuspendibleThreadSet オブジェクト内の全部のスレッドが実際に停止する (あるいは SuspendibleThreadSet::leave() で登録を解除する)までブロックされる)
(SuspendibleThreadSet::yield() は, その SuspendibleThreadSet オブジェクトに対して SuspendibleThreadSet::suspend_all() が呼ばれていれば, 呼び出したスレッドを停止させる)
(SuspendibleThreadSet::resume_all() は, yield() でブロックしているスレッドを Monitor::notify_all() でたたき起こす)
((cite: hotspot/src/share/vm/gc_implementation/shared/concurrentGCThread.hpp))
// Add the current thread to the set. May block if a suspension
// is in progress.
void join();
// Removes the current thread from the set.
void leave();
// Returns "true" iff an suspension is in progress.
bool should_yield() { return _async_stop; }
// Suspends the current thread if a suspension is in progress (for
// the duration of the suspension.)
void yield(const char* id);
// Return when all threads in the set are suspended.
void suspend_all();
// Allow suspended threads to resume.
void resume_all();
// Redundant initializations okay.
ConcurrentGCThread クラスの _sts フィールド (static フィールド) に(のみ)格納されている.
((cite: hotspot/src/share/vm/gc_implementation/shared/concurrentGCThread.hpp))
// All instances share this one set.
static SuspendibleThreadSet _sts;
See: here for details
ConcurrentGCThread から Java のモニタを操作するための Thread クラス.
なお, 現在は ConcurrentGCThread と ReferenceHandler スレッド (= java.lang.ref.Reference オブジェクトを処理するスレッド) が協調する用途で(のみ)使用されている (SurrogateLockerThread スレッドは, ConcurrentGCThread による GC が始まる前に java.lang.ref の pending_list_lock を取得して ReferenceHandler の処理と排他する役割を担っている) (See: here for details).
((cite: hotspot/src/share/vm/gc_implementation/shared/concurrentGCThread.hpp))
// The SurrogateLockerThread is used by concurrent GC threads for
// manipulating Java monitors, in particular, currently for
// manipulating the pending_list_lock. XXX
class SurrogateLockerThread: public JavaThread {
SurrogateLockerThread::make() 内で(のみ)生成されている (See: here for details).
以下の箇所に(のみ)格納されている. ただし, このクラスのインスタンス自体は1つしか存在しない (どちらも同じインスタンスを指している).
どちらに格納されるかは, 使用する GC アルゴリズムによって決まる (CMS なら ConcurrentMarkSweepThread, G1GC なら ConcurrentMarkThread).
((cite: hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp))
class ConcurrentMarkSweepThread: public ConcurrentGCThread {
...
static SurrogateLockerThread* _slt;
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.hpp))
class ConcurrentMarkThread: public ConcurrentGCThread {
...
static SurrogateLockerThread* _slt;
(正確には, このフィールドは JavaThread の線形リストを格納するフィールド. JavaThread オブジェクトは _next フィールドで次の JavaThread オブジェクトを指せる構造になっている. 生成した JavaThread オブジェクトは全てこの線形リスト内に格納されている)
(なお, この線形リストには Threads::add() で登録される)
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.