hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
void
PSParallelCompact::move_and_update(ParCompactionManager* cm, SpaceId space_id) {
{- -------------------------------------------
(1) もし処理対象の領域に何も入っていなければ, することも何もないので, ここでリターン.
---------------------------------------- -}
const MutableSpace* sp = space(space_id);
if (sp->is_empty()) {
return;
}
{- -------------------------------------------
(1) (変数宣言など)
(end_addr は, 現在の top 位置. ここまでが処理範囲になる)
---------------------------------------- -}
ParallelCompactData& sd = PSParallelCompact::summary_data();
ParMarkBitMap* const bitmap = mark_bitmap();
HeapWord* const dp_addr = dense_prefix(space_id);
HeapWord* beg_addr = sp->bottom();
HeapWord* end_addr = sp->top();
{- -------------------------------------------
(1) (デバッグ用の処理) (#ifdef ASSERT 時にのみ実行)
---------------------------------------- -}
#ifdef ASSERT
assert(beg_addr <= dp_addr && dp_addr <= end_addr, "bad dense prefix");
if (cm->should_verify_only()) {
VerifyUpdateClosure verify_update(cm, sp);
bitmap->iterate(&verify_update, beg_addr, end_addr);
return;
}
if (cm->should_reset_only()) {
ResetObjectsClosure reset_objects(cm);
bitmap->iterate(&reset_objects, beg_addr, end_addr);
return;
}
#endif
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
const size_t beg_region = sd.addr_to_region_idx(beg_addr);
const size_t dp_region = sd.addr_to_region_idx(dp_addr);
{- -------------------------------------------
(1) もし dense prefix が存在する場合には,
PSParallelCompact::update_and_deadwood_in_dense_prefix() を呼んで,
dense prefix 部分の live オブジェクト内のポインタの修正処理, 及び
dead オブジェクトをダミーオブジェクトで上書きする処理を行う.
---------------------------------------- -}
if (beg_region < dp_region) {
update_and_deadwood_in_dense_prefix(cm, space_id, beg_region, dp_region);
}
{- -------------------------------------------
(1) (変数宣言など)
(dest_addr は, dense prefix の直後のアドレス.
より正確には, そこに partial object がはみ出している場合には, その partial object の直後のアドレス.
(この partial object は, PSParallelCompact::fill_dense_prefix_end() で埋めたもの?))
---------------------------------------- -}
// The destination of the first live object that starts in the region is one
// past the end of the partial object entering the region (if any).
HeapWord* const dest_addr = sd.partial_obj_end(dp_region);
HeapWord* const new_top = _space_info[space_id].new_top();
assert(new_top >= dest_addr, "bad new_top value");
const size_t words = pointer_delta(new_top, dest_addr);
{- -------------------------------------------
(1) (なお, dense prefix 以降に live オブジェクトが 1つも存在しなければ(= words が 0 ならば), 以下の処理は行わない)
dense prefix の直後(dest_addr)から現在の top 位置(end_addr)までの範囲を
ParMarkBitMap::iterate() で辿る.
この中で, MoveAndUpdateClosure によってオブジェクトの移動処理を行う.
---------------------------------------- -}
if (words > 0) {
ObjectStartArray* start_array = _space_info[space_id].start_array();
MoveAndUpdateClosure closure(bitmap, cm, start_array, dest_addr, words);
ParMarkBitMap::IterationStatus status;
status = bitmap->iterate(&closure, dest_addr, end_addr);
assert(status == ParMarkBitMap::full, "iteration not complete");
assert(bitmap->find_obj_beg(closure.source(), end_addr) == end_addr,
"live objects skipped because closure is full");
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.