hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
void ParallelCompactData::add_obj(HeapWord* addr, size_t len)
{
{- -------------------------------------------
(1) (変数宣言など)
(対象のオブジェクトの先頭と最後に対応するリージョンを調べる)
---------------------------------------- -}
const size_t obj_ofs = pointer_delta(addr, _region_start);
const size_t beg_region = obj_ofs >> Log2RegionSize;
const size_t end_region = (obj_ofs + len - 1) >> Log2RegionSize;
{- -------------------------------------------
(1) (デバッグ用の処理)
---------------------------------------- -}
DEBUG_ONLY(Atomic::inc_ptr(&add_obj_count);)
DEBUG_ONLY(Atomic::add_ptr(len, &add_obj_size);)
{- -------------------------------------------
(1) 対象のオブジェクトが1つのリージョン内に収まる場合は,
ParallelCompactData::RegionData::add_live_obj() を呼び出して
対応するリージョンの live object 量情報を増加させるだけ.
(なお, 対象のオブジェクトが全部そのリージョン内に収まっているので,
増加させる量は対象のオブジェクトの大きさに等しい)
この場合は, ここでリターン.
---------------------------------------- -}
if (beg_region == end_region) {
// All in one region.
_region_data[beg_region].add_live_obj(len);
return;
}
{- -------------------------------------------
(1) 対象のオブジェクトが1つのリージョン内に収まらない場合は,
対象のオブジェクトを含んでいる全てのリージョンに対して以下の関数を呼び出し,
対応するリージョンの live object 量情報を増加させる.
* 最初のリージョン
ParallelCompactData::RegionData::add_live_obj()
* 2つ目以降のリージョン
ParallelCompactData::RegionData::set_partial_obj_size() 及び
ParallelCompactData::RegionData::set_partial_obj_addr()
(この場合の増加量は, それぞれのリージョンに対して
対象のオブジェクトのうちの何バイトを格納しているかを調べ,
その分だけ増やしていく)
---------------------------------------- -}
// First region.
const size_t beg_ofs = region_offset(addr);
_region_data[beg_region].add_live_obj(RegionSize - beg_ofs);
klassOop klass = ((oop)addr)->klass();
// Middle regions--completely spanned by this object.
for (size_t region = beg_region + 1; region < end_region; ++region) {
_region_data[region].set_partial_obj_size(RegionSize);
_region_data[region].set_partial_obj_addr(addr);
}
// Last region.
const size_t end_ofs = region_offset(addr + len - 1);
_region_data[end_region].set_partial_obj_size(end_ofs + 1);
_region_data[end_region].set_partial_obj_addr(addr);
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.