メモリ確保の試みが全て失敗した場合, 最終的に 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). これらは以下のように使い分けられている.
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)
See: here for details
See: here for details
(#Under Construction) See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.