Top

CollectorPolicy クラス関連のクラス (CollectorPolicy, ClearedAllSoftRefs, GenCollectorPolicy, TwoGenerationCollectorPolicy, MarkSweepPolicy)

これらは, Garbage Collection 処理用の補助クラス. より具体的に言うと, GC に関する「ポリシー」を表すクラス. 使用する GC アルゴリズムの種別や GC が必要とする情報(Java ヒープの大きさ等)を管理している (See: here for details). (See: here, here, here and here for details)

なおコメントによると, これらのクラスは完成したものではなく, 新しい GC アルゴリズムによって必要な情報が増えれば今後も拡張されていく, とのこと.

    ((cite: hotspot/src/share/vm/memory/collectorPolicy.hpp))
    // This class (or more correctly, subtypes of this class)
    // are used to define global garbage collector attributes.
    // This includes initialization of generations and any other
    // shared resources they may need.
    //
    // In general, all flag adjustment and validation should be
    // done in initialize_flags(), which is called prior to
    // initialize_size_info().
    //
    // This class is not fully developed yet. As more collector(s)
    // are added, it is expected that we will come across further
    // behavior that requires global attention. The correct place
    // to deal with those issues is this class.

クラス一覧(class list)


CollectorPolicy

概要(Summary)

全ての CollectorPolicy クラスの基底クラス.

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

    ((cite: hotspot/src/share/vm/memory/collectorPolicy.hpp))
    class CollectorPolicy : public CHeapObj {

詳細(Details)

See: here for details


GenCollectorPolicy

概要(Summary)

CollectorPolicy クラスのサブクラスの1つ.

このクラスは 世代別 GC (Generational GC) を用いる場合用.

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

    ((cite: hotspot/src/share/vm/memory/collectorPolicy.hpp))
    class GenCollectorPolicy : public CollectorPolicy {

詳細(Details)

See: here for details


TwoGenerationCollectorPolicy

概要(Summary)

GenCollectorPolicy クラスのサブクラス (なお, 現在はこのクラスが唯一のサブクラス).

このクラスは 2 世代の 世代別 GC (Generational GC) を用いる場合用.

(なおコメントでは, 全ての CollectorPolicy はこのクラスのサブクラスになっている, と書かれているが, G1CollectorPolicy は違うんだが...#TODO)

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

    ((cite: hotspot/src/share/vm/memory/collectorPolicy.hpp))
    // All of hotspot's current collectors are subtypes of this
    // class. Currently, these collectors all use the same gen[0],
    // but have different gen[1] types. If we add another subtype
    // of CollectorPolicy, this class should be broken out into
    // its own file.

    class TwoGenerationCollectorPolicy : public GenCollectorPolicy {

詳細(Details)

See: here for details


MarkSweepPolicy

概要(Summary)

TwoGenerationCollectorPolicy クラスの具象サブクラスの1つ.

このクラスは Serial Old GC を用いる場合用 (= ParallelScavenge でも G1GC でも CMS でもない場合用) (See: here for details).

    ((cite: hotspot/src/share/vm/memory/collectorPolicy.hpp))
    class MarkSweepPolicy : public TwoGenerationCollectorPolicy {

詳細(Details)

See: here for details


ClearedAllSoftRefs

概要(Summary)

CollectorPolicy 用の補助クラス.

GC によって soft reference が消去された場合に, CollectorPolicy オブジェクトの _all_soft_refs_clear フィールドをセットする処理を行う.

    ((cite: hotspot/src/share/vm/memory/collectorPolicy.hpp))
    class ClearedAllSoftRefs : public StackObj {

なお, CollectorPolicy::all_soft_refs_clear フィールドは, 「直近の GC 処理によって全ての soft reference が消去されたかどうか」を示すフィールド (消去されていると true がセットされる). (See: CollectorPolicy::allsoft_refs_clear())

    ((cite: hotspot/src/share/vm/memory/collectorPolicy.hpp))
      // Set to true by the GC if the just-completed gc cleared all
      // softrefs.  This is set to true whenever a gc clears all softrefs, and
      // set to false each time gc returns to the mutator.  For example, in the
      // ParallelScavengeHeap case the latter would be done toward the end of
      // mem_allocate() where it returns op.result()
      bool _all_soft_refs_clear;

使われ方(Usage)

GC 処理中で局所変数として生成される. なお, コンストラクタ引数として以下の2つを受け取る.

生成されたスコープが終わる時点で, デストラクタによってフィールドの値がセットされる.

    ((cite: hotspot/src/share/vm/memory/genCollectedHeap.cpp))
    void GenCollectedHeap::do_collection(bool  full,
                                         bool   clear_all_soft_refs,
                                         size_t size,
                                         bool   is_tlab,
                                         int    max_level) {
    ...
      const bool do_clear_all_soft_refs = clear_all_soft_refs ||
                              collector_policy()->should_clear_all_soft_refs();

      ClearedAllSoftRefs casr(do_clear_all_soft_refs, collector_policy());

内部構造(Internal structure)

実際の処理は以下の通り. コンストラクタの clear_all_soft_refs 引数が true だった場合には, デストラクタで CollectorPolicy::cleared_all_soft_refs() の呼び出しが行われる.

    ((cite: hotspot/src/share/vm/memory/collectorPolicy.hpp))
      ClearedAllSoftRefs(bool clear_all_soft_refs,
                         CollectorPolicy* collector_policy) :
        _clear_all_soft_refs(clear_all_soft_refs),
        _collector_policy(collector_policy) {}

      ~ClearedAllSoftRefs() {
        if (_clear_all_soft_refs) {
          _collector_policy->cleared_all_soft_refs();
        }
      }

なお, CollectorPolicy::cleared_all_soft_refs() は以下のような関数 (GC 時に soft reference が消去されると, _should_clear_all_soft_refs が満たされたことを示すために呼び出される).

    ((cite: hotspot/src/share/vm/memory/collectorPolicy.hpp))
      // Called by the GC after Soft Refs have been cleared to indicate
      // that the request in _should_clear_all_soft_refs has been fulfilled.
      void cleared_all_soft_refs();

実際の CollectorPolicy::cleared_all_soft_refs() の中身は以下の通り.

    ((cite: hotspot/src/share/vm/memory/collectorPolicy.cpp))
    void CollectorPolicy::cleared_all_soft_refs() {
      // If near gc overhear limit, continue to clear SoftRefs.  SoftRefs may
      // have been cleared in the last collection but if the gc overhear
      // limit continues to be near, SoftRefs should still be cleared.
      if (size_policy() != NULL) {
        _should_clear_all_soft_refs = size_policy()->gc_overhead_limit_near();
      }
      _all_soft_refs_clear = true;
    }

詳細(Details)

See: here for details



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