Top


定義場所(file name)

hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp

説明(description)

// The result is valid during the summary phase, after the initial summarization
// of each space into itself, and before final summarization.

名前(function name)

inline double
PSParallelCompact::reclaimed_ratio(const RegionData* const cp,
                                   HeapWord* const bottom,
                                   HeapWord* const top,
                                   HeapWord* const new_top)
{

本体部(body)

    (この関数が正しい計算結果を返すのは, summary phase 中で
     PSParallelCompact::summarize_spaces_quick() による計算が終わってから, 
     最終的な summary data の計算をし終えるまでの間)
  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      ParallelCompactData& sd = summary_data();

  {- -------------------------------------------
  (1) (assert)
      ---------------------------------------- -}

      assert(cp != NULL, "sanity");
      assert(bottom != NULL, "sanity");
      assert(top != NULL, "sanity");
      assert(new_top != NULL, "sanity");
      assert(top >= new_top, "summary data problem?");
      assert(new_top > bottom, "space is empty; should not be here");
      assert(new_top >= cp->destination(), "sanity");
      assert(top >= sd.region_to_addr(cp), "sanity");

  {- -------------------------------------------
  (1) 引数で指定された region (以下の cp) を dense prefix の終端に選んだ場合の
      嬉しさを計算し, 計算結果をリターンする.
      (値が大きいほど, 嬉しさが大きいことを意味する)

      この値の計算には, 以下のようなトレードオフが反映されている.
      * dense prefix が小さいほど, GC で回収できるゴミの量は増える. 
        (以下の reclaimable が, cp を dense prefix の終端に選んだ場合に回収できるゴミの量を表す)
      * dense prefix が小さいほど, コンパクション処理のオーバーヘッドは増える.
        (移動したオブジェクトに対するポインタの修正処理, 移動時のオブジェクトのコピー処理)
        (以下の divisor が, オーバーヘッドを示す.
         この divisor は, コンパクション後の live オブジェクト量(bottom ~ new_top)を 
         cp のコンパクション先アドレス(destination)で分割し, 
         destination より前を 1倍, 後を 1.25 倍して足し合わせたものとなっている.
         destination が前になるほど(= dense prefix が小さくなるほど), 
         1.25 倍される量が増えるため divisor が大きくなる.)
      ---------------------------------------- -}

      HeapWord* const destination = cp->destination();
      const size_t dense_prefix_live  = pointer_delta(destination, bottom);
      const size_t compacted_region_live = pointer_delta(new_top, destination);
      const size_t compacted_region_used = pointer_delta(top,
                                                         sd.region_to_addr(cp));
      const size_t reclaimable = compacted_region_used - compacted_region_live;

      const double divisor = dense_prefix_live + 1.25 * compacted_region_live;
      return double(reclaimable) / divisor;
    }

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