hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
void
PSParallelCompact::clear_data_covering_space(SpaceId id)
{
{- -------------------------------------------
(1) (この段階では, それぞれの Space オブジェクトの top は
まだ更新されていないので GC 前の値のままになっている.
GC 結果を反映した top 位置は, 対応する SpaceInfo オブジェクトの SpaceInfo::new_top() に入っており,
GC 処理の最後で Space オブジェクトの top がこの値に修正される.
marking bitmap については, top より上の箇所は(今回の GC 中に使用していないので)クリアする必要は無い.
summary data についても, top と new_top の大きい方までクリアすれば十分.)
---------------------------------------- -}
// At this point, top is the value before GC, new_top() is the value that will
// be set at the end of GC. The marking bitmap is cleared to top; nothing
// should be marked above top. The summary data is cleared to the larger of
// top & new_top.
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
MutableSpace* const space = _space_info[id].space();
HeapWord* const bot = space->bottom();
HeapWord* const top = space->top();
HeapWord* const max_top = MAX2(top, _space_info[id].new_top());
{- -------------------------------------------
(1) PSParallelCompact::_mark_bitmap については,
ParMarkBitMap::clear_range() で
処理対象の Space の bottom~top に該当する部分をクリアする.
---------------------------------------- -}
const idx_t beg_bit = _mark_bitmap.addr_to_bit(bot);
const idx_t end_bit = BitMap::word_align_up(_mark_bitmap.addr_to_bit(top));
_mark_bitmap.clear_range(beg_bit, end_bit);
{- -------------------------------------------
(1) PSParallelCompact::_summary_data については,
ParallelCompactData::clear_range() で
処理対象の Space の bottom~top または bottom~new_top の大きい方に該当する部分をクリアする.
---------------------------------------- -}
const size_t beg_region = _summary_data.addr_to_region_idx(bot);
const size_t end_region =
_summary_data.addr_to_region_idx(_summary_data.region_align_up(max_top));
_summary_data.clear_range(beg_region, end_region);
{- -------------------------------------------
(1) 処理対象の Space に対応する SplitInfo オブジェクトが GC 中に使用されていれば,
(= SplitInfo::is_valid() が true ならば),
SplitInfo::clear() で中身をクリアしておく,
---------------------------------------- -}
// Clear the data used to 'split' regions.
SplitInfo& split_info = _space_info[id].split_info();
if (split_info.is_valid()) {
split_info.clear();
}
{- -------------------------------------------
(1) (verify)
---------------------------------------- -}
DEBUG_ONLY(split_info.verify_clear();)
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.