hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
void PSParallelCompact::pre_compact(PreGCValues* pre_gc_values)
{
{- -------------------------------------------
(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.