hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
ParMarkBitMapClosure::IterationStatus
MoveAndUpdateClosure::do_addr(HeapWord* addr, size_t words) {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(destination() != NULL, "sanity");
assert(bitmap()->obj_size(addr) == words, "bad size");
{- -------------------------------------------
(1) #TODO
---------------------------------------- -}
_source = addr;
assert(PSParallelCompact::summary_data().calc_new_pointer(source()) ==
destination(), "wrong destination");
{- -------------------------------------------
(1) もしコンパクション先の領域の空き容量(MoveAndUpdateClosure::words_remaining())が
処理対象のオブジェクトをコピーするには不足していた場合は,
ここでリターン (返値は ParMarkBitMap::would_overflow).
---------------------------------------- -}
if (words > words_remaining()) {
return ParMarkBitMap::would_overflow;
}
{- -------------------------------------------
(1) ObjectStartArray::allocate_block() で,
対応する箇所の start array (offset array) の情報を更新しておく.
(この処理は, オブジェクトの位置がコンパクション前と全く同じであっても行う)
---------------------------------------- -}
// The start_array must be updated even if the object is not moving.
if (_start_array != NULL) {
_start_array->allocate_block(destination());
}
{- -------------------------------------------
(1) Copy::aligned_conjoint_words() を呼んで, コンパクション後の位置にオブジェクトをコピーする.
(ただし, オブジェクトの位置がコンパクション前と全く同じであれば, この処理は行わない)
---------------------------------------- -}
if (destination() != source()) {
DEBUG_ONLY(PSParallelCompact::check_new_location(source(), destination());)
Copy::aligned_conjoint_words(source(), destination(), words);
}
{- -------------------------------------------
(1) oopDesc::update_contents() を呼んで,
コンパクション後の位置にあるオブジェクト内のポインタを修正する.
---------------------------------------- -}
oop moved_oop = (oop) destination();
moved_oop->update_contents(compaction_manager());
assert(moved_oop->is_oop_or_null(), "Object should be whole at this point");
{- -------------------------------------------
(1) MoveAndUpdateClosure::update_state() を呼んで,
コンパクション先領域の空き容量情報などを更新しておく.
---------------------------------------- -}
update_state(words);
assert(destination() == (HeapWord*)moved_oop + moved_oop->size(), "sanity");
{- -------------------------------------------
(1) リターン.
(返値は, もうコンパクション先の領域に空き容量が全くなければ ParMarkBitMap::full,
そうでなければ ParMarkBitMap::incomplete)
---------------------------------------- -}
return is_full() ? ParMarkBitMap::full : ParMarkBitMap::incomplete;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.