hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
ParallelCompactData::RegionData*
PSParallelCompact::first_dead_space_region(const RegionData* beg,
const RegionData* end)
{
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
const size_t region_size = ParallelCompactData::RegionSize;
ParallelCompactData& sd = summary_data();
size_t left = sd.region(beg);
size_t right = end > beg ? sd.region(end) - 1 : left;
{- -------------------------------------------
(1) 引数の beq と end で指定された範囲で, 最初の dead オブジェクトが存在する region を探す.
探索は (left と right という変数を使った) binary search.
見つかれば, そこでリターン.
---------------------------------------- -}
// Binary search.
while (left < right) {
// Equivalent to (left + right) / 2, but does not overflow.
const size_t middle = left + (right - left) / 2;
RegionData* const middle_ptr = sd.region(middle);
HeapWord* const dest = middle_ptr->destination();
HeapWord* const addr = sd.region_to_addr(middle);
assert(dest != NULL, "sanity");
assert(dest <= addr, "must move left");
if (middle > left && dest < addr) {
right = middle - 1;
} else if (middle < right && middle_ptr->data_size() == region_size) {
left = middle + 1;
} else {
return middle_ptr;
}
}
{- -------------------------------------------
(1) left と right が一致してしまったら, left のアドレスをリターンする.
(dead オブジェクトがいなかった場合とか, そもそも beg と end が 1つの region 内に収まっていた場合とか)
---------------------------------------- -}
return sd.region(left);
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.