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.