hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
// The result is valid during the summary phase, after the initial summarization
// of each space into itself, and before final summarization.
inline double
PSParallelCompact::reclaimed_ratio(const RegionData* const cp,
HeapWord* const bottom,
HeapWord* const top,
HeapWord* const new_top)
{
(この関数が正しい計算結果を返すのは, 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.