Top

TaskQueue クラス関連のクラス (TaskQueueStats, TaskQueueSuper, Age, GenericTaskQueue, OverflowTaskQueue, TaskQueueSetSuper, GenericTaskQueueSet, TerminatorTerminator, ParallelTaskTerminator, StarTask, ObjArrayTask)

これらは, Garbage Collection 処理用の補助クラス. より具体的に言うと, GC 処理をマルチスレッド化するためのクラス (See: here for details).

クラス一覧(class list)


TaskQueueStats

概要(Summary)

デバッグ用(開発時用)のクラス (#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
      };

使われ方(Usage)

インスタンスの格納場所(where its instances are stored)

TaskQueueSuper オブジェクトの stats フィールドに(のみ)格納されている.

情報の出力箇所(where the recorded information is output)

G1CollectedHeap::print_taskqueue_stats() 内, 及び ParScanThreadStateSet::print_taskqueue_stats() 内で出力されている模様.

備考(Notes)

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

詳細(Details)

See: here for details


TaskQueueSuper

概要(Summary)

全ての 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).

詳細(Details)

See: here for details


TaskQueueSuper::Age

概要(Summary)

TaskQueueSuper クラス内で使われる補助クラス (See: here for details).

    ((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
      class Age {

なお Age という型も使われるが, これは TaskQueueSuper::Age の別名.

    ((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
      typedef typename TaskQueueSuper<N>::Age Age;

使われ方(Usage)

インスタンスの格納場所(where its instances are stored)

TaskQueueSuper オブジェクトの _age フィールドに(のみ)格納されている.

    ((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
      volatile Age _age;

内部構造(Internal structure)

内部には以下のフィールド(のみ)を含む.

    ((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;
        };

詳細(Details)

See: here for details


GenericTaskQueue

概要(Summary)

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;

詳細(Details)

See: here for details


OverflowTaskQueue

概要(Summary)

特殊な 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;

内部構造(Internal structure)

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);

詳細(Details)

See: here for details


TaskQueueSetSuper

概要(Summary)

複数の TaskQueue オブジェクトを束ねるコンテナクラス (の基底クラス) (See: here for details).

    ((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
    class TaskQueueSetSuper: public CHeapObj {

なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.

詳細(Details)

See: here for details


GenericTaskQueueSet

概要(Summary)

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;

詳細(Details)

See: here for details


TerminatorTerminator

概要(Summary)

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 であり, 実際に使われるのはサブクラス.

内部構造(Internal structure)

内部には, 以下のメソッド(のみ)が定義されている.

これは (特に concurrent な GC アルゴリズムの場合に) もう終了してもよいかどうかの判定を行う関数.

    ((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
      virtual bool should_exit_termination() = 0;

詳細(Details)

See: here for details


ParallelTaskTerminator

概要(Summary)

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 {

使われ方(Usage)

終了判定は ParallelTaskTerminator::offer_termination() で行われる.

詳細(Details)

See: here for details


StarTask

概要(Summary)

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 {

使われ方(Usage)

各種の GC 処理中で(のみ)使用されている.

(例えば, oop* と narrowOop* の両方を push 可能な TaskQueue を作る用途, 等)

内部構造(Internal structure)

コンストラクタの時点で型に応じて印 (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);
      }

詳細(Details)

See: here for details


ObjArrayTask

概要(Summary)

Garbage Collection 処理用の補助クラス.

長すぎて一度に処理したくないポインタ配列に対して, いったん処理を pending するためのクラス (どこまで処理済みかを記録してくれるクラス).

    ((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
    class ObjArrayTask

使われ方(Usage)

各種の GC 処理中で(のみ)使用されている. (MarkSweep::push_objarray(), ParCompactionManager::push_objarray(), etc)

内部構造(Internal structure)

内部には以下のフィールド(のみ)を含む (そして, メソッドはこれらのフィールドへの getter メソッド(アクセサメソッド)のみ).

    ((cite: hotspot/src/share/vm/utilities/taskqueue.hpp))
      oop _obj;
      int _index;

詳細(Details)

See: here for details



This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.