hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.inline.hpp
template <class T>
inline void PSPromotionManager::claim_or_forward_internal_depth(T* p) {
{- -------------------------------------------
(1)
---------------------------------------- -}
if (p != NULL) { // XXX: error if p != NULL here
{- -------------------------------------------
(1) 処理対象のポインタ(p)が指している oop を取得する.
---------------------------------------- -}
oop o = oopDesc::load_decode_heap_oop_not_null(p);
{- -------------------------------------------
(1) 既に forward 済み(forwarding pointer)なら,
(1) New 領域を指している場合には, CardTableExtension::inline_write_ref_field_gc() で
該当する card を youngergen_card (つまり「New 領域への参照有り」) に設定した後,
(2) oopDesc::encode_store_heap_oop_not_null() で, 処理対象のポインタ(p)をコピー先のアドレスに書き換える.
forward 済みでなければ, PSPromotionManager::push_depth() でキューにポインタを登録する.
---------------------------------------- -}
if (o->is_forwarded()) {
o = o->forwardee();
// Card mark
if (PSScavenge::is_obj_in_young((HeapWord*) o)) {
PSScavenge::card_table()->inline_write_ref_field_gc(p, o);
}
oopDesc::encode_store_heap_oop_not_null(p, o);
} else {
push_depth(p);
}
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.