Top


定義場所(file name)

hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp

名前(function name)

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) {

本体部(body)

  {- -------------------------------------------
  (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.