これらは, Garbage Collection 処理用の補助クラス. より具体的に言うと, GC 処理をマルチスレッド化するためのクラス (See: here for details).
デバッグ用(開発時用)のクラス (#ifdef ASSERT 時にしか定義されない). (なお, 正確に言うと「TASKQUEUE_STATS マクロ定数が 0 以外の場合でないと定義されない」. ただし, TASKQUEUE_STATS マクロ定数は #ifdef ASSERT 時にだけ 1 に #define されるので同義)
TaskQueue に関する統計情報を集めるためのクラス.
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
#if TASKQUEUE_STATS
class TaskQueueStats {
以下のような情報が収集される模様.
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
enum StatId {
push, // number of taskqueue pushes
pop, // number of taskqueue pops
pop_slow, // subset of taskqueue pops that were done slow-path
steal_attempt, // number of taskqueue steal attempts
steal, // number of taskqueue steals
overflow, // number of overflow pushes
overflow_max_len, // max length of overflow stack
last_stat_id
};
TaskQueueSuper オブジェクトの stats フィールドに(のみ)格納されている.
G1CollectedHeap::print_taskqueue_stats() 内, 及び ParScanThreadStateSet::print_taskqueue_stats() 内で出力されている模様.
TASKQUEUE_STATS マクロ定数は以下のように #define される.
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
// Simple TaskQueue stats that are collected by default in debug builds.
#if !defined(TASKQUEUE_STATS) && defined(ASSERT)
#define TASKQUEUE_STATS 1
#elif !defined(TASKQUEUE_STATS)
#define TASKQUEUE_STATS 0
#endif
See: here for details
全ての TaskQueue クラスの基底クラス (See: here for details).
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
template <unsigned int N>
class TaskQueueSuper: public CHeapObj {
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス (See: GenericTaskQueue).
See: here for details
TaskQueueSuper クラス内で使われる補助クラス (See: here for details).
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
class Age {
なお Age という型も使われるが, これは TaskQueueSuper
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
typedef typename TaskQueueSuper<N>::Age Age;
TaskQueueSuper オブジェクトの _age フィールドに(のみ)格納されている.
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
volatile Age _age;
内部には以下のフィールド(のみ)を含む.
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
union {
size_t _data;
fields _fields;
};
なお, fields 型は以下のような struct.
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
struct fields {
idx_t _top;
idx_t _tag;
};
See: here for details
TaskQueueSuper クラスの具象サブクラス (See: here for details).
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
template<class E, unsigned int N = TASKQUEUE_SIZE>
class GenericTaskQueue: public TaskQueueSuper<N> {
なお以下のような型も使われるが, これは GenericTaskQueue の別名.
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
typedef GenericTaskQueue<E, N> taskqueue_t;
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
typedef GenericTaskQueue<oop> OopTaskQueue;
((cite: hotspot/src/share/vm/memory/genOopClosures.hpp))
typedef GenericTaskQueue<oop, TASKQUEUE_SIZE> OopTaskQueue;
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp))
typedef GenericTaskQueue<oop> CMTaskQueue;
See: here for details
特殊な GenericTaskQueue クラス (See: here for details).
要素数が上限に達した場合に備えて overflow stack という別のスタックをもう一つ保持している. push() 時に上限に達していると overflow stack の方に積まれる.
なおコメントによると, 「is_empty() は TaskQueue と overflow stack の両方がから出ないと true にならないが, size() はオーバーライドしていないため TaskQueue 内の要素数だけを返すことに注意」とのこと.
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
// OverflowTaskQueue is a TaskQueue that also includes an overflow stack for
// elements that do not fit in the TaskQueue.
//
// This class hides two methods from super classes:
//
// push() - push onto the task queue or, if that fails, onto the overflow stack
// is_empty() - return true if both the TaskQueue and overflow stack are empty
//
// Note that size() is not hidden--it returns the number of elements in the
// TaskQueue, and does not include the size of the overflow stack. This
// simplifies replacement of GenericTaskQueues with OverflowTaskQueues.
template<class E, unsigned int N = TASKQUEUE_SIZE>
class OverflowTaskQueue: public GenericTaskQueue<E, N>
なお以下のような型も使われるが, これは OverflowTaskQueue の別名.
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
typedef OverflowTaskQueue<StarTask> OopStarTaskQueue;
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
typedef OverflowTaskQueue<size_t> RegionTaskQueue;
((cite: hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp))
typedef OverflowTaskQueue<StarTask> RefToScanQueue;
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.hpp))
typedef OverflowTaskQueue<ObjArrayTask, QUEUE_SIZE> ObjArrayTaskQueue;
overflow stack は Stack
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
typedef Stack<E> overflow_t;
overflow stack から要素を取り出すには pop_overflow() というメソッドを用いる模様.
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
// Attempt to pop from the overflow stack; return true if anything was popped.
inline bool pop_overflow(E& t);
See: here for details
複数の TaskQueue オブジェクトを束ねるコンテナクラス (の基底クラス) (See: here for details).
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
class TaskQueueSetSuper: public CHeapObj {
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
See: here for details
TaskQueueSetSuper クラスの具象サブクラス (See: here for details).
なお要素の型は template でパラメタライズされている.
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
template<class T>
class GenericTaskQueueSet: public TaskQueueSetSuper {
なお以下のような型も使われるが, これは GenericTaskQueueSet の別名.
((cite: hotspot/src/share/vm/memory/genOopClosures.hpp))
typedef GenericTaskQueueSet<OopTaskQueue> OopTaskQueueSet;
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
typedef GenericTaskQueueSet<OopTaskQueue> OopTaskQueueSet;
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
typedef GenericTaskQueueSet<OopStarTaskQueue> OopStarTaskQueueSet;
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
typedef GenericTaskQueueSet<RegionTaskQueue> RegionTaskQueueSet;
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp))
typedef GenericTaskQueueSet<CMTaskQueue> CMTaskQueueSet;
((cite: hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp))
typedef GenericTaskQueueSet<RefToScanQueue> RefToScanQueueSet;
((cite: hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp))
typedef GenericTaskQueueSet<ObjToScanQueue> ObjToScanQueueSet;
((cite: hotspot/src/share/vm/gc_implementation/parNew/parOopClosures.hpp))
typedef GenericTaskQueueSet<ObjToScanQueue> ObjToScanQueueSet;
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.hpp))
typedef GenericTaskQueueSet<ObjArrayTaskQueue> ObjArrayTaskQueueSet;
See: here for details
ParallelTaskTerminator::offer_termination() で使われる補助クラス (の基底クラス).
(このクラスのサブクラスのオブジェクトが ParallelTaskTerminator::offer_termination() に引数として渡される (See: ParallelTaskTerminator))
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
// When to terminate from the termination protocol.
class TerminatorTerminator: public CHeapObj {
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
内部には, 以下のメソッド(のみ)が定義されている.
これは (特に concurrent な GC アルゴリズムの場合に) もう終了してもよいかどうかの判定を行う関数.
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
virtual bool should_exit_termination() = 0;
See: here for details
TaskQueue を用いた作業中に使用される一時オブジェクト(StackObjクラス).
TaskQueueSet を用いた work stealing 時に, 処理を終了してよいかどうかの判定を行う.
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
// A class to aid in the termination of a set of parallel tasks using
// TaskQueueSet's for work stealing.
...
class ParallelTaskTerminator: public StackObj {
終了判定は ParallelTaskTerminator::offer_termination() で行われる.
See: here for details
oop* と narrowOop* を統一的に扱うためのラッパー的なクラス (oop* と narrowOop* からなる tagged union 型のようなクラス).
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
// This is a container class for either an oop* or a narrowOop*.
// Both are pushed onto a task queue and the consumer will test is_narrow()
// to determine which should be processed.
class StarTask {
各種の GC 処理中で(のみ)使用されている.
(例えば, oop* と narrowOop* の両方を push 可能な TaskQueue を作る用途, 等)
コンストラクタの時点で型に応じて印 (COMPRESSED_OOP_MASK) を付けているので, どちらを格納しているのかは判別可能 (その意味で C 言語的な union よりは tagged union に近い).
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
StarTask(narrowOop* p) {
assert(((uintptr_t)p & COMPRESSED_OOP_MASK) == 0, "Information loss!");
_holder = (void *)((uintptr_t)p | COMPRESSED_OOP_MASK);
}
StarTask(oop* p) {
assert(((uintptr_t)p & COMPRESSED_OOP_MASK) == 0, "Information loss!");
_holder = (void*)p;
}
種別を判別するための is_narrow() というメソッドも提供されている.
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
bool is_narrow() const {
return (((uintptr_t)_holder & COMPRESSED_OOP_MASK) != 0);
}
See: here for details
Garbage Collection 処理用の補助クラス.
長すぎて一度に処理したくないポインタ配列に対して, いったん処理を pending するためのクラス (どこまで処理済みかを記録してくれるクラス).
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
class ObjArrayTask
各種の GC 処理中で(のみ)使用されている. (MarkSweep::push_objarray(), ParCompactionManager::push_objarray(), etc)
内部には以下のフィールド(のみ)を含む (そして, メソッドはこれらのフィールドへの getter メソッド(アクセサメソッド)のみ).
((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
oop _obj;
int _index;
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.