UseSerialGC の場合, GenCollectedHeap の Major GC 処理は, TenuredGeneration::collect() を呼び出すことで行われる (See: here for details).
実際の Major GC 処理は, TenuredGeneration::collect() から呼び出される GenMarkSweep::invoke_at_safepoint() の中に実装されている. この GenMarkSweep::invoke_at_safepoint() の処理は, 大きく分けると4つのフェーズからなる.
TenuredGeneration::collect()
-> OneContigSpaceCardGeneration::collect()
-> GenMarkSweep::invoke_at_safepoint()
-> (1) Phase 1: 全ての生きているオブジェクト(live object)にマークを付ける.
-> GenMarkSweep::mark_sweep_phase1()
(1) strong root から辿り着けるオブジェクト全てに mark を付ける.
-> GenCollectedHeap::gen_process_strong_roots()
(なお使用するクロージャーは (Perm領域用/非Perm領域用のどちらも) MarkSweep::FollowRootClosure)
-> (See: here for details)
-> MarkSweep::FollowRootClosure::do_oop()
-> MarkSweep::follow_root()
まだマークが付いていないオブジェクトであれば, 以下の処理を行う.
-> MarkSweep::mark_object() でマークを付ける
-> oopDesc::follow_contents()
-> *Klass::oop_follow_contents() で再帰的にポインタを辿ってマークを付けていく.
(#TODO クラス毎に少しずつ違うけど, 基本的には MarkSweep::mark_and_push() で辿るだけ??)
(1) 以上の処理で見つかった参照オブジェクトを処理する.
-> ReferenceProcessor::process_discovered_references()
(なお使用するクロージャーは,
MarkSweep::IsAliveClosure, MarkSweep::KeepAliveClosure, MarkSweep::FollowStackClosure.
AbstractRefProcTaskExecutor は使用しない (NULL を渡す))
-> (後述) (See: here for details)
(1) 最後に, #TODO
-> SystemDictionary::do_unloading()
-> CodeCache::do_unloading()
->
-> MarkSweep::follow_weak_klass_links()
-> MarkSweep::follow_mdo_weak_refs()
-> StringTable::unlink()
-> SymbolTable::unlink()
(1) Phase 2: 各 live object に対して, コンパクション後の新しいアドレスを計算する.
-> GenMarkSweep::mark_sweep_phase2()
-> GenCollectedHeap::prepare_for_compaction() (New/Old 領域用)
-> Generation::prepare_for_compaction() (<= この関数が New と Old 用に 2回呼ばれる)
-> ContiguousSpace::prepare_for_compaction() (<= この関数は, 各世代で保有している Space の数だけ呼ばれる)
-> SCAN_AND_FORWARD
-> CompactibleSpace::forward()
-> Generation::prepare_for_compaction() (Perm 領域用)
(1) Phase 3: 各 live object 内のポインタを新しいアドレスに修正する.
-> GenMarkSweep::mark_sweep_phase3()
-> CompactingPermGenGen::pre_adjust_pointers()
-> GenCollectedHeap::gen_process_strong_roots()
(なお使用するクロージャーは (Perm領域用/非Perm領域用のどちらも) MarkSweep::AdjustPointerClosure)
-> (上述)
-> MarkSweep::AdjustPointerClosure::do_oop()
-> MarkSweep::adjust_pointer()
-> GenCollectedHeap::gen_process_weak_roots()
->
-> MarkSweep::adjust_marks()
-> GenCollectedHeap::generation_iterate() (New/Old 領域用)
(なお使用するクロージャーは GenAdjustPointersClosure)
-> GenAdjustPointersClosure::do_generation() (Old 用)
-> Generation::adjust_pointers()
-> OneContigSpaceCardGeneration::space_iterate()
-> AdjustPointersClosure::do_space()
-> CompactibleSpace::adjust_pointers()
-> SCAN_AND_ADJUST_POINTERS
-> oopDesc::adjust_pointers()
-> Klass::oop_adjust_pointers()
(#TODO クラス毎に少しずつ違うけど, 基本的には MarkSweep::adjust_pointer() でポインタを修正するだけ??)
-> GenAdjustPointersClosure::do_generation() (New 用)
-> (同上)
-> DefNewGeneration::space_iterate()
-> AdjustPointersClosure::do_space() (Eden 用)
-> AdjustPointersClosure::do_space() (From 用)
-> AdjustPointersClosure::do_space() (To 用)
-> CompactingPermGenGen::adjust_pointers()
-> CompactibleSpace::adjust_pointers()
-> (同上)
(1) Phase 4: 各 live object を新しいアドレスに移動させる.
-> GenMarkSweep::mark_sweep_phase4()
-> Generation::compact() (Perm 領域用)
->
-> GenCollectedHeap::generation_iterate() (New/Old 領域用)
(なお使用するクロージャーは GenCompactClosure)
-> (同上)
-> GenCompactClosure::do_generation() (Old 用)
-> Generation::compact()
-> CompactibleSpace::compact()
-> SCAN_AND_COMPACT
-> Copy::aligned_conjoint_words()
-> oopDesc::init_mark()
-> GenCompactClosure::do_generation() (New 用)
-> (同上)
-> Generation::post_compact() (Perm 領域用)
-> #TODO
->
See: here for details
See: here for details
(#Under Construction) See: here for details
(#Under Construction) See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
(#Under Construction)
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
(#Under Construction) See: here for details
See: here for details
See: here for details
See: here for details
(#Under Construction) See: here for details
(#Under Construction) See: here for details
See: here for details
See: here for details
(#Under Construction) See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
(#Under Construction) See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.