hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_forwardee>
template <class T>
void G1ParCopyClosure <do_gen_barrier, barrier, do_mark_forwardee>
::do_oop_work(T* p) {
{- -------------------------------------------
(1) 処理対象のポインタ(oop)を取得する.
---------------------------------------- -}
oop obj = oopDesc::load_decode_heap_oop(p);
assert(barrier != G1BarrierRS || obj != NULL,
"Precondition: G1BarrierRS implies obj is nonNull");
{- -------------------------------------------
(1) ポインタが GC 対象の region (collection set) を差している場合(= in_cset_fast_test() が true)には, 以下の処理を行う.
* 既に対象のオブジェクトがコピー済み(= is_forwarded() が true)であれば
oopDesc::encode_store_heap_oop() でポインタをコピー先のアドレスに書き換えるだけ.
* まだコピーされていなければ,
G1ParCopyHelper::copy_to_survivor_space() でオブジェクトをコピーし,
oopDesc::encode_store_heap_oop() でポインタをコピー先のアドレスに書き換える.
(ついでに, テンプレート引数の barrier が G1BarrierRS の場合には,
このコピー&ポインタ書き換えが終わった後で
G1ParScanThreadState::update_rs() で Remembered Set(G1RemSet オブジェクト) の更新処理を行っている)
---------------------------------------- -}
// here the null check is implicit in the cset_fast_test() test
if (_g1->in_cset_fast_test(obj)) {
#if G1_REM_SET_LOGGING
gclog_or_tty->print_cr("Loc "PTR_FORMAT" contains pointer "PTR_FORMAT" "
"into CS.", p, (void*) obj);
#endif
if (obj->is_forwarded()) {
oopDesc::encode_store_heap_oop(p, obj->forwardee());
} else {
oop copy_oop = copy_to_survivor_space(obj);
oopDesc::encode_store_heap_oop(p, copy_oop);
}
// When scanning the RS, we only care about objs in CS.
if (barrier == G1BarrierRS) {
_par_scan_state->update_rs(_from, p, _par_scan_state->queue_num());
}
}
{- -------------------------------------------
(1) もし...#TODO であれば,
G1ParScanThreadState::update_rs() で Remembered Set(G1RemSet オブジェクト) を更新しておく.
---------------------------------------- -}
if (barrier == G1BarrierEvac && obj != NULL) {
_par_scan_state->update_rs(_from, p, _par_scan_state->queue_num());
}
{- -------------------------------------------
(1) もし
...#TODO
---------------------------------------- -}
if (do_gen_barrier && obj != NULL) {
par_do_barrier(p);
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.