Top


定義場所(file name)

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

名前(function name)

void PSParallelCompact::pre_compact(PreGCValues* pre_gc_values)
{

本体部(body)

  {- -------------------------------------------
  (1) (From 領域と To 領域は Minor GC の度に入れ替わっているので, 
       _space_info フィールド内の情報を更新しておかないといけない.

       なお, この更新処理は無条件で(= 常に)行う.
       promotion failure が起こって Major GC になった際には
       その回での Minor GC では入れ替えが行われていないが, 
       その場合でも promotion failure が生じる前に何回 Minor GC が発生していたかは分からないので.)
      ---------------------------------------- -}

      // Update the from & to space pointers in space_info, since they are swapped
      // at each young gen gc.  Do the update unconditionally (even though a
      // promotion failure does not swap spaces) because an unknown number of minor
      // collections will have swapped the spaces an unknown number of times.

  {- -------------------------------------------
  (1) (トレース出力)
      ---------------------------------------- -}

      TraceTime tm("pre compact", print_phases(), true, gclog_or_tty);

  {- -------------------------------------------
  (1) _space_info フィールド内の From と To 領域に該当する箇所を, 現在の情報に更新する.
      ---------------------------------------- -}

      ParallelScavengeHeap* heap = gc_heap();
      _space_info[from_space_id].set_space(heap->young_gen()->from_space());
      _space_info[to_space_id].set_space(heap->young_gen()->to_space());

  {- -------------------------------------------
  (1) PreGCValues::fill() を呼んで, 
      引数で渡された PreGCValues オブジェクト内のフィールドを初期化する.
      (フィールドの値を各ヒープ領域の使用量で初期化する) (See: PreGCValues)
      ---------------------------------------- -}

      pre_gc_values->fill(heap);

  {- -------------------------------------------
  (1) (assert) (See: ParCompactionManager::reset())
      ---------------------------------------- -}

      ParCompactionManager::reset();

  {- -------------------------------------------
  (1) (デバッグ用の処理)
      ---------------------------------------- -}

      NOT_PRODUCT(_mark_bitmap.reset_counters());
      DEBUG_ONLY(add_obj_count = add_obj_size = 0;)
      DEBUG_ONLY(mark_bitmap_count = mark_bitmap_size = 0;)

  {- -------------------------------------------
  (1) GC を行うことになったので, 以下の値を増加させておく.
      * CollectedHeap::total_collections()
        (See: CollectedHeap::total_collections())
      * PSParallelCompact::_total_invocations
        (See: PSParallelCompact::total_invocations())
      ---------------------------------------- -}

      // Increment the invocation count
      heap->increment_total_collections(true);

      // We need to track unique mark sweep invocations as well.
      _total_invocations++;

  {- -------------------------------------------
  (1) (トレース出力)
      ---------------------------------------- -}

      if (PrintHeapAtGC) {
        Universe::print_heap_before_gc();
      }

  {- -------------------------------------------
  (1) ParallelScavengeHeap::accumulate_statistics_all_tlabs() で, 
      TLAB 関係の統計情報を更新しておく.
      ---------------------------------------- -}

      // Fill in TLABs
      heap->accumulate_statistics_all_tlabs();

  {- -------------------------------------------
  (1) GC 処理の前に ParallelScavengeHeap::ensure_parsability() を呼んで, 
      各 TLAB に残っている未使用領域を埋めて
      オブジェクトでひとつながりの状態にしておく (GC アルゴリズムを簡単にするため).
      ---------------------------------------- -}

      heap->ensure_parsability(true);  // retire TLABs

  {- -------------------------------------------
  (1) (verify)
      ---------------------------------------- -}

      if (VerifyBeforeGC && heap->total_collections() >= VerifyGCStartAt) {
        HandleMark hm;  // Discard invalid handles created during verification
        gclog_or_tty->print(" VerifyBeforeGC:");
        Universe::verify(true);
      }

  {- -------------------------------------------
  (1) (verify)
      ---------------------------------------- -}

      // Verify object start arrays
      if (VerifyObjectStartArray &&
          VerifyBeforeGC) {
        heap->old_gen()->verify_object_start_array();
        heap->perm_gen()->verify_object_start_array();
      }

  {- -------------------------------------------
  (1) (verify)
      ---------------------------------------- -}

      DEBUG_ONLY(mark_bitmap()->verify_clear();)
      DEBUG_ONLY(summary_data().verify_clear();)

  {- -------------------------------------------
  (1) GCTaskManager::release_all_resources() を呼ぶ.

      (これにより, 全ての Worker Thread において
       GCTaskManager::should_release_resources() が true を返すようになり, 
       次回の Worker Thread によるタスク処理時にリソースの解放処理も行われる.
       See: GCTaskManager::should_release_resources())
      ---------------------------------------- -}

      // Have worker threads release resources the next time they run a task.
      gc_task_manager()->release_all_resources();
    }

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