Top


定義場所(file name)

hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp

名前(function name)

void
PSParallelCompact::move_and_update(ParCompactionManager* cm, SpaceId space_id) {

本体部(body)

  {- -------------------------------------------
  (1) もし処理対象の領域に何も入っていなければ, することも何もないので, ここでリターン.
      ---------------------------------------- -}

      const MutableSpace* sp = space(space_id);
      if (sp->is_empty()) {
        return;
      }

  {- -------------------------------------------
  (1) (変数宣言など)
      (end_addr は, 現在の top 位置. ここまでが処理範囲になる)
      ---------------------------------------- -}

      ParallelCompactData& sd = PSParallelCompact::summary_data();
      ParMarkBitMap* const bitmap = mark_bitmap();
      HeapWord* const dp_addr = dense_prefix(space_id);
      HeapWord* beg_addr = sp->bottom();
      HeapWord* end_addr = sp->top();

  {- -------------------------------------------
  (1) (デバッグ用の処理) (#ifdef ASSERT 時にのみ実行)
      ---------------------------------------- -}

    #ifdef ASSERT
      assert(beg_addr <= dp_addr && dp_addr <= end_addr, "bad dense prefix");
      if (cm->should_verify_only()) {
        VerifyUpdateClosure verify_update(cm, sp);
        bitmap->iterate(&verify_update, beg_addr, end_addr);
        return;
      }

      if (cm->should_reset_only()) {
        ResetObjectsClosure reset_objects(cm);
        bitmap->iterate(&reset_objects, beg_addr, end_addr);
        return;
      }
    #endif

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      const size_t beg_region = sd.addr_to_region_idx(beg_addr);
      const size_t dp_region = sd.addr_to_region_idx(dp_addr);

  {- -------------------------------------------
  (1) もし dense prefix が存在する場合には, 
      PSParallelCompact::update_and_deadwood_in_dense_prefix() を呼んで, 
      dense prefix 部分の live オブジェクト内のポインタの修正処理, 及び 
      dead オブジェクトをダミーオブジェクトで上書きする処理を行う.
      ---------------------------------------- -}

      if (beg_region < dp_region) {
        update_and_deadwood_in_dense_prefix(cm, space_id, beg_region, dp_region);
      }

  {- -------------------------------------------
  (1) (変数宣言など)
      (dest_addr は, dense prefix の直後のアドレス.
       より正確には, そこに partial object がはみ出している場合には, その partial object の直後のアドレス.
       (この partial object は, PSParallelCompact::fill_dense_prefix_end() で埋めたもの?))
      ---------------------------------------- -}

      // The destination of the first live object that starts in the region is one
      // past the end of the partial object entering the region (if any).
      HeapWord* const dest_addr = sd.partial_obj_end(dp_region);
      HeapWord* const new_top = _space_info[space_id].new_top();
      assert(new_top >= dest_addr, "bad new_top value");
      const size_t words = pointer_delta(new_top, dest_addr);

  {- -------------------------------------------
  (1) (なお, dense prefix 以降に live オブジェクトが 1つも存在しなければ(= words が 0 ならば), 以下の処理は行わない)

      dense prefix の直後(dest_addr)から現在の top 位置(end_addr)までの範囲を
      ParMarkBitMap::iterate() で辿る.
      この中で, MoveAndUpdateClosure によってオブジェクトの移動処理を行う.
      ---------------------------------------- -}

      if (words > 0) {
        ObjectStartArray* start_array = _space_info[space_id].start_array();
        MoveAndUpdateClosure closure(bitmap, cm, start_array, dest_addr, words);

        ParMarkBitMap::IterationStatus status;
        status = bitmap->iterate(&closure, dest_addr, end_addr);
        assert(status == ParMarkBitMap::full, "iteration not complete");
        assert(bitmap->find_obj_beg(closure.source(), end_addr) == end_addr,
               "live objects skipped because closure is full");
      }
    }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.