hotspot/src/share/vm/memory/genOopClosures.inline.hpp
// NOTE! Any changes made here should also be made
// in ScanClosure::do_oop_work()
template <class T> inline void FastScanClosure::do_oop_work(T* p) {
{- -------------------------------------------
(1) (もし処理対象のポインタが NULL だったり, 処理範囲の境界(_boundary)を超えている場合には, 何もしない)
---------------------------------------- -}
T heap_oop = oopDesc::load_heap_oop(p);
// Should we copy the obj?
if (!oopDesc::is_null(heap_oop)) {
oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
if ((HeapWord*)obj < _boundary) {
assert(!_g->to()->is_in_reserved(obj), "Scanning field twice?");
{- -------------------------------------------
(1) ポインタの指し先を DefNewGeneration::copy_to_survivor_space() でコピーする.
(ただし, 既にコピー済み(= is_forwarded() が true) であればそのコピー先を取得するだけ)
---------------------------------------- -}
oop new_obj = obj->is_forwarded() ? obj->forwardee()
: _g->copy_to_survivor_space(obj);
{- -------------------------------------------
(1) 処理対象のポインタ(p)をコピー先のアドレスに書き換える.
---------------------------------------- -}
oopDesc::encode_store_heap_oop_not_null(p, new_obj);
{- -------------------------------------------
(1) コンストラクタ引数でバリア処理を実行するよう指定されていれば (= _gc_barrier が true ならば),
(この関数の処理でポインタを変更したので)
OopsInGenClosure::do_barrier() を呼んで,
remembered set を正しい値に修正しておく.
---------------------------------------- -}
if (_gc_barrier) {
// Now call parent closure
do_barrier(p);
}
}
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.