Up Top

Memory allocation (& GC 処理) : メモリ関係の初期化処理の流れ (1)


概要(Summary)

メモリ関係のデータ構造は HotSpot の起動時に初期化される. この初期化時には, まず使用する GC アルゴリズムが決定される.

その後, Universe::initialize_heap() の中で 実際のヒープ領域の確保やその管理用のオブジェクトの生成が行われる (See: here and here for details).

処理の流れ (概要)(Execution Flows : Summary)

(HotSpot の起動時処理) (See: here for details)
-> Threads::create_vm()
   -> (1) コマンドラインオプションに基づき GC アルゴリズムを決定する. 指定がなければ適当なものを選択する.
          -> Arguments::parse()
             -> Arguments::set_ergonomics_flags()
                -> os::is_server_class_machine()
                -> Arguments::should_auto_select_low_pause_collector()

      (2) GC アルゴリズムに応じた CollectorPolicy オブジェクトおよび CollectedHeap オブジェクトを生成&初期化する
          -> init_globals()
             -> universe_init()
                -> Universe::initialize_heap()
                   -> (1) コマンドラインオプションに応じて,
                          適切な CollectorPolicy およびヒープ領域管理用のクラス(CollectedHeap のサブクラス)を生成する.

                          * UseParallelGC の場合:
                            * CollectorPolicy : 無し 
                              (正確には GenerationSizer が CollectorPolicy に相当するが, 後で生成される)
                            * CollectedHeap   : ParallelScavengeHeap()
                          * UseG1GC の場合:
                            * CollectorPolicy : G1CollectorPolicy_BestRegionsFirst()
                            * CollectedHeap   : G1CollectedHeap()
                          * UseSerialGC の場合
                            * CollectorPolicy : MarkSweepPolicy()
                            * CollectedHeap   : GenCollectedHeap()
                          * UseConcMarkSweepGC && UseAdaptiveSizePolicy の場合
                            * CollectorPolicy : ASConcurrentMarkSweepPolicy()
                            * CollectedHeap   : GenCollectedHeap()
                          * UseConcMarkSweepGC && ! UseAdaptiveSizePolicy の場合
                            * CollectorPolicy : ConcurrentMarkSweepPolicy()  
                            * CollectedHeap   : GenCollectedHeap()
                          * それ以外の場合
                            * CollectorPolicy : MarkSweepPolicy()
                            * CollectedHeap   : GenCollectedHeap()

                      (2) 生成した CollectedHeap オブジェクトの CollectedHeap::initialize() メソッドを呼び出す.
                          (これは各ヒープクラスごとに以下のようにオーバーライドされている.
                          この中で, 使用するGCアルゴリズムに合わせたヒープ領域の確保が行われる)

                          * UseParallelGCParallelScavenge の場合:

                            -> ParallelScavengeHeap::initialize()
                               -> (See: here for details)

                          * UseG1GC の場合:

                            -> G1CollectedHeap::initialize()
                               -> (See: here for details)

                          * それ以外の場合:

                            -> GenCollectedHeap::initialize()
                               -> (See: here for details)

                      (3) UseCompressedOops 使用時には, ヒープのベースアドレスとポインタのシフト幅を設定しておく
                          -> Universe::set_narrow_oop_base()
                          -> Universe::set_narrow_oop_shift()

                      (4) UseTLAB オプションが指定されていれば ThreadLocalAllocBuffer の初期化を行う
                          -> ThreadLocalAllocBuffer::startup_initialization()

      (3) GC アルゴリズムとして CMS か G1GC が指定されている場合には, SurrogateLockerThread を生成する
          -> ConcurrentMarkSweepThread::makeSurrogateLockerThread()  or  ConcurrentMarkThread::makeSurrogateLockerThread()
             -> (See: here for details)

処理の流れ (詳細)(Execution Flows : Details)

Arguments::set_ergonomics_flags()

See: here for details

os::is_server_class_machine()

See: here for details

Arguments::should_auto_select_low_pause_collector()

See: here for details

universe_init()

See: here for details

Universe::initialize_heap()

See: here for details

ThreadLocalAllocBuffer::startup_initialization()

See: here for details


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