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.