hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
void
ParallelCompactData::summarize_dense_prefix(HeapWord* beg, HeapWord* end)
{
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(region_offset(beg) == 0, "not RegionSize aligned");
assert(region_offset(end) == 0, "not RegionSize aligned");
{- -------------------------------------------
(1) 引数の beg と end で指定された範囲に含まれる全ての region について, 以下の関数を呼び出して
対応する ParallelCompactData::RegionData オブジェクトに情報を設定する.
(といっても, この関数は dense prefix に含まれる region 用なので
全てコンパクション先は自分自身.
このため設定内容は非常に簡単.)
* ParallelCompactData::RegionData::set_destination()
コンパクション先のアドレスは, 現在の自分自身のアドレスとする.
* ParallelCompactData::RegionData::set_destination_count()
コンパクション先は自分自身だけなので 0.
* ParallelCompactData::RegionData::set_source_region()
コンパクション元は自分自身とする.
* ParallelCompactData::RegionData::set_data_location()
対応するアドレスも, 現在の自分自身のアドレスとする.
* ParallelCompactData::RegionData::set_live_obj_size()
(dead オブジェクトは1つもないので) RegionSize から
region の先頭に掛かっている partial object 量を引いたものとする.
---------------------------------------- -}
size_t cur_region = addr_to_region_idx(beg);
const size_t end_region = addr_to_region_idx(end);
HeapWord* addr = beg;
while (cur_region < end_region) {
_region_data[cur_region].set_destination(addr);
_region_data[cur_region].set_destination_count(0);
_region_data[cur_region].set_source_region(cur_region);
_region_data[cur_region].set_data_location(addr);
// Update live_obj_size so the region appears completely full.
size_t live_size = RegionSize - _region_data[cur_region].partial_obj_size();
_region_data[cur_region].set_live_obj_size(live_size);
++cur_region;
addr += RegionSize;
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.