これらは, Garbage Collection 処理用の補助クラス. より具体的に言うと, 実際の GC 処理を行う Thread クラス (See: here for details).
ParallelScavenge GC において, 実際の GC 処理を行う WorkerThread クラス (See: here for details).
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.hpp))
class GCTaskThread : public WorkerThread {
GCTaskManager クラスの _thread フィールドに(のみ)格納されている (正確には, このフィールドは GCTaskThread の配列を格納するフィールド. この中に, 使用される全ての GCTaskManager オブジェクトが格納されている)
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp))
class GCTaskManager : public CHeapObj {
...
GCTaskThread** _thread; // Array of worker threads.
GCTaskThread::create() というファクトリメソッドが用意されており, その中で(のみ)生成されている.
(そして, このファクトリメソッドは GCTaskManager::initialize() 内で(のみ)呼び出されている)
See: here for details
See: here for details
See: here for details
保守運用機能のためのクラス (関連するオプションが指定されている場合にのみ使用される) (See: PrintGCTaskTimeStamps).
GCTaskThread クラス内で使用される補助クラス. ParallelScavenge 関連の統計情報を格納するために使用される.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.hpp))
class GCTaskTimeStamp : public CHeapObj
GCTaskThread クラスの _time_stamps インスタンスフィールドに(のみ)格納されている
(正確には, このフィールドは GCTaskThread の配列を格納するフィールド. この中に GCTaskTimeStampEntries 個数分の GCTaskTimeStamp オブジェクトが格納されている)
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.hpp))
GCTaskTimeStamp* _time_stamps;
GCTaskThread::GCTaskThread() 内で(のみ)生成されている.
(ただし, PrintGCTaskTimeStamps オプションが指定されている場合にしか生成されない)
See: here for details
GCTaskThread::run() 内で情報の記録が行われている.
(ただし, PrintGCTaskTimeStamps オプションが指定されている場合にしか記録されない)
GCTack 実行の前後で TimeStamp オブジェクトを使って時間を記録し, その時間と実行した GCTask の名前を記録している. (なお, GCTaskTimeStampEntries 個数分の GCTaskTimeStamp オブジェクトを保持しているのでローテーションで使用している. 次に使用する GCTaskTimeStamp オブジェクトは _time_stamp_index フィールドで管理している)
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp))
void GCTaskThread::run() {
...
TimeStamp timer;
...
// In case the update is costly
if (PrintGCTaskTimeStamps) {
timer.update();
}
...
task->do_it(manager(), which());
...
if (PrintGCTaskTimeStamps) {
assert(_time_stamps != NULL, "Sanity (PrintGCTaskTimeStamps set late?)");
timer.update();
GCTaskTimeStamp* time_stamp = time_stamp_at(_time_stamp_index++);
time_stamp->set_name(name);
time_stamp->set_entry_time(entry_time);
time_stamp->set_exit_time(timer.ticks());
}
集めた結果は, GCTaskThread::print_task_time_stamps() で(のみ)使用されている (この関数で集めた結果が出力されている).
なお, この関数は PSParallelCompact::invoke_no_policy() や PSScavenge::invoke_no_policy() 内から以下のように呼び出される.
PSParallelCompact::invoke_no_policy() -> GCTaskManager::print_task_time_stamps() -> GCTaskThread::print_task_time_stamps()
PSScavenge::invoke_no_policy() -> GCTaskManager::print_task_time_stamps() -> 同上
See: here for details
See: here for details
内部には以下の3つのフィールド(のみ)を含む. それぞれ, GC 処理が行われた時間(開始時間, 終了時間), 実行した GCTask 名, を記録する.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.hpp))
jlong _entry_time;
jlong _exit_time;
char* _name;
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.