メモリ関係のデータ構造は HotSpot の起動時に初期化される. この初期化時には, まず使用する GC アルゴリズムが決定される.
その後, Universe::initialize_heap() の中で 実際のヒープ領域の確保やその管理用のオブジェクトの生成が行われる (See: here and here for details).
(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)
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.