Up Top

Memory allocation (& GC 処理) : メモリの確保処理 (GC 処理) : slow-path の処理 (4) GC 処理 : G1CollectedHeap の場合


概要(Summary)

メモリ確保の試みが全て失敗した場合, 最終的に CollectedHeap::mem_allocate() が呼び出される (See: here for details). G1CollectedHeap は CollectedHeap::mem_allocate() をオーバーライドしているので, 実際に呼び出されるのは G1CollectedHeap::mem_allocate() になる.

G1CollectedHeap::mem_allocate() 内では GC を実行してでも確保が試みられる. なお, GC 処理を行う VM Operation クラスは 2種類用意されている (VM_G1IncCollectionPause と VM_G1CollectForAllocation). これらは以下のように使い分けられている.

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

G1CollectedHeap::mem_allocate()
-> (メモリ確保が成功するか, あるいは成功しないと判断するまで, 以下の処理をループ)

   (1) メモリ確保を試みる. 成功すれば結果をリターン.
       -> G1CollectedHeap::attempt_allocation() または G1CollectedHeap::attempt_allocation_humongous()
          どちらが呼び出されるかで以下のように処理が変わる.

          * G1CollectedHeap::attempt_allocation() の場合は, 以下の呼び出しで確保処理が行われる.
            -> G1AllocRegion::attempt_allocation()
               -> (See: here for details)
            -> G1CollectedHeap::attempt_allocation_slow()
               -> (See: here for details)
               -> G1CollectedHeap::do_collection_pause()   (<= Minor GC 処理)
                  -> VM_G1IncCollectionPause::doit()
                     -> (See: here for details)

          * G1CollectedHeap::attempt_allocation_humongous() の場合は, 以下の呼び出しで確保処理が行われる.
            -> #TODO

   (1) GC を試みる. 実際に GC が実行されれば(確保の成否に関わらず)結果をリターンする
       -> VM_G1CollectForAllocation::doit()                (<= Major GC 処理)
          -> (See: here for details)

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

G1CollectedHeap::mem_allocate()

See: here for details

G1CollectedHeap::do_collection_pause()

See: here for details

G1CollectedHeap::attempt_allocation_humongous()

(#Under Construction) See: here for details

Subcategories


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