これらは, Garbage Collection 処理用の補助クラス. より具体的に言うと, ParallelScavenge GC において, GC スレッド (GCTaskThread) に対する GC 処理要求を管理するためのクラス (See: here for details).
GCTaskThread に対する処理要求を表すクラスの基底クラス (See: here for details).
GCTaskThread に対する処理要求は GCTask クラス(のサブクラス)のオブジェクトとして表現される.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
// The abstract base GCTask.
class GCTask : public ResourceObj {
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
See: here for details
GCTask 用の補助クラス (See: here for details).
GCTask の種別を表す定数値を納めた名前空間(AllStatic クラス)
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
// Known kinds of GCTasks, for predicates.
class Kind : AllStatic {
現状では, 種別を示す以下の定数値が定義されているだけ.
(正確には, この定数値を文字列化する to_string() メソッドも定義されている)
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
enum kind {
unknown_task,
ordinary_task,
barrier_task,
noop_task
};
See: here for details
GCTask を詰めるキュー (というか doubly-linked list).
GCTask はこのキューに詰められて GCTaskThread に渡され,
GCTaskThread はここから GCTask を取り出して処理を行う
(See: here and here for details).
なお, キューの操作は MT-safe ではないので, 排他的に処理したい場合は SynchronizedGCTaskQueue でラップして使うこと, とのこと.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
// A doubly-linked list of GCTasks.
// The list is not synchronized, because sometimes we want to
// build up a list and then make it available to other threads.
// See also: SynchronizedGCTaskQueue.
class GCTaskQueue : public ResourceObj {
GCTaskQueue には現状では2つの使われ方がある.
GCTask は正確には GCTaskManager クラス経由で GCTaskThread に渡される.
GCTaskManager は, それ自身が (内部的に GCTaskQueue を用いた) キューのようなクラスになっており, GCTaskThread はここから自分が実行する GCTask を取得する.
GC 処理を要求するスレッドは, 新しい GCTaskQueue を作成し, 実行して欲しい GCTask をそこに詰めて GCTaskManager に渡す. GCTaskManager は, 渡された GCTaskQueue の中身を自身の GCTaskQueue に移し替える. そしてその中身が GCTaskThread へと伝えられる.
GCTaskQueue::create_on_c_heap() と GCTaskQueue::create() という2つのファクトリメソッドが用意されており, その中で(のみ)生成されている.
(GCTaskManager::initialize() からのみ呼び出されている) (GCTaskManager 用のキューは, 開放されるとまずいので, C ヒープ上に確保する).
GC 処理を要求するスレッドは, このメソッドが生成した GCTaskQueue に GCTask を詰めて GCTaskManager に引き渡す.
See: here for details
See: here for details
See: here for details
排他的にキューへの挿入が行える GCTaskQueue.
(といっても, 現在は GCTaskManager クラス内でしか使われていないので, GCTaskManager 用の補助クラスといった感じ)
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
// A GCTaskQueue that can be synchronized.
// This "has-a" GCTaskQueue and a mutex to do the exclusion.
class SynchronizedGCTaskQueue : public CHeapObj {
GCTaskManager クラスの _queue フィールドに(のみ)格納されている.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
class GCTaskManager : public CHeapObj {
...
SynchronizedGCTaskQueue* _queue; // Queue of tasks.
SynchronizedGCTaskQueue::create() というファクトリメソッドが用意されており, その中で(のみ)生成されている.
(そして, このファクトリメソッドは GCTaskManager::initialize() 内で(のみ)呼び出されている)
See: here for details
See: here for details
なお, このクラス自体は GCTaskQueue のサブクラスにはなっていない.
その代わりに, private フィールドに GCTaskQueue オブジェクトを保持して明示的に delegate している.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
private:
// Instance state.
GCTaskQueue* _unsynchronized_queue; // Has-a unsynchronized queue.
Monitor * _lock; // Lock to control access.
See: here for details
GCTaskManager からのコールバックを表すクラスの基底クラス.
(GCTaskManager 内の GCTask が全て完了すると呼び出される模様)
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
// This is an abstract base class for getting notifications
// when a GCTaskManager is done.
class NotifyDoneClosure : public CHeapObj {
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
肝心のサブクラスが見当たらないような... #TODO
それに, GCTaskManager にはコンストラクタの第2引数で渡せることになっているのに, 引数1個のコンストラクタしか使われていないような... #TODO
(WaitForBarrierGCTask があるからこのクラスは要らない?? #TODO)
See: here for details
ParallelScavenge において, GCTaskThread や GCTask の管理を行うクラス (See: here for details).
GCTaskThread を生成したり, GCTaskThread に GC 要求が渡される際のブローカーとして働いたりする
(GC 処理を要求したいスレッドは GCTaskManager 経由で GCTaskThread に要求を出す. GCTaskManager は, それ自身が (内部的に GCTaskQueue を用いた) キューのようなクラスになっており, GCTaskThread はここから自分が実行する GCTask を取得する)
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
// The GCTaskManager is a queue of GCTasks, and accessors
// to allow the queue to be accessed from many threads.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
class GCTaskManager : public CHeapObj {
ParallelScavengeHeap オブジェクトの _gc_task_manager フィールドに(のみ)格納されている.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp))
class ParallelScavengeHeap : public CollectedHeap {
...
static GCTaskManager* _gc_task_manager; // The task manager.
GCTaskManager::create(uint workers) と GCTaskManager::create(uint workers, NotifyDoneClosure* ndc) という2つのファクトリメソッドが用意されており, その中で(のみ)生成されている.
ParallelScavengeHeap::initialize() 内で(のみ)呼び出されている.
(こちらは使われていないような... #TODO)
See: here for details
See: here for details
See: here for details
See: here for details
GCTask クラスのサブクラスの1つ.
このクラスは「何も行わない処理(NOOP)」を表す.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
// A noop task that does nothing,
// except take us around the GCTaskThread loop.
class NoopGCTask : public GCTask {
GCTaskThread が確保しているリソースを解放したいときなど, とりあえず GCTaskThread の処理ループを1回まわしたい, という時に使われる模様(?)
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp))
// The queue is empty, but we were woken up.
// Just hand back a Noop task,
// in case someone wanted us to release resources, or whatever.
result = noop_task();
GCTaskManager オブジェクトの _noop_task フィールドに(のみ)格納されている.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
class GCTaskManager : public CHeapObj {
...
NoopGCTask* _noop_task; // The NoopGCTask instance.
NoopGCTask::create() と NoopGCTask::create_on_c_heap() という2つのファクトリメソッドが用意されており, その中で(のみ)生成されている.
(こちらは使われていないような... #TODO)
GCTaskManager::initialize() 内で(のみ)呼び出されている.
See: here for details
See: here for details
See: here for details
See: here for details
GCTask クラスのサブクラスの1つ.
このクラスはバリア同期として働く (先行するタスクが全部完了するまで後続のタスクを開始させない).
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
// A BarrierGCTask blocks other tasks from starting,
// and waits until it is the only task running.
class BarrierGCTask : public GCTask {
See: here for details
?? (このクラスは使用箇所が見当たらないような...)
BarrierGCTask クラスのサブクラスの1つ.
バリアを張るついでに, 全ての GCTaskThread に対して resource area を解放するよう要求を出す.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
// A ReleasingBarrierGCTask is a BarrierGCTask
// that tells all the tasks to release their resource areas.
class ReleasingBarrierGCTask : public BarrierGCTask {
See: here for details
BarrierGCTask クラスのサブクラスの1つ.
バリアを張るついでに, 先行するタスクが全て完了したら NotifyDoneClosure での通知も行う.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
// A NotifyingBarrierGCTask is a BarrierGCTask
// that calls a notification method when it is the only task running.
class NotifyingBarrierGCTask : public BarrierGCTask {
(このクラスの使用箇所は見当たらないが... #TODO)
See: here for details
BarrierGCTask クラスのサブクラスの1つ.
呼び出し元がバリア完了時までブロックされるメソッド(同期式のメソッド)を備えている. (NotifyingBarrierGCTask の多くのユースケースはこれでカバーできる, とのこと)
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
// A WaitForBarrierGCTask is a BarrierGCTask
// with a method you can call to wait until
// the BarrierGCTask is done.
// This may cover many of the uses of NotifyingBarrierGCTasks.
class WaitForBarrierGCTask : public BarrierGCTask {
WaitForBarrierGCTask::wait_for() メソッドで待機を行う.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
void wait_for();
See: here for details
WaitForBarrierGCTask クラス内で使用される補助クラス.
バリア同期を待つための Monitor (およびそれを操作するメソッド) を納めた名前空間(AllStatic クラス).
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
class MonitorSupply : public AllStatic {
メソッドとしては以下の2種類が定義されている.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
public:
// Reserve a Monitor*.
static Monitor* reserve();
// Release a Monitor*.
static void release(Monitor* instance);
WaitForBarrierGCTask のコンストラクタで Monitor が取得される.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp))
WaitForBarrierGCTask::WaitForBarrierGCTask(bool on_c_heap) :
...
_monitor = MonitorSupply::reserve();
そして WaitForBarrierGCTask::wait_for() 内で, その Monitor に対して wait() が呼び出される.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp))
void WaitForBarrierGCTask::wait_for() {
...
monitor()->wait(Mutex::_no_safepoint_check_flag, 0);
そして WaitForBarrierGCTask::do_it() 内で notify_all() が呼び出される.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp))
void WaitForBarrierGCTask::do_it(GCTaskManager* manager, uint which) {
...
monitor()->notify_all();
// Release monitor().
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.