hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
HeapRegion* G1CollectedHeap::new_mutator_alloc_region(size_t word_size,
bool force) {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
assert(!force || g1_policy()->can_expand_young_list(),
"if force is true we should be able to expand the young list");
{- -------------------------------------------
(1) まだ young_list が一杯ではない場合,
(つまり New 領域相当の領域を増やす余地がある場合. より具体的に言うと, G1CollectorPolicy::is_young_list_full() が false の場合)
あるいは (young_list が一杯であっても) 引数の force が true の場合には,
以下の if ブロック中で新しい HeapRegion の確保を試みる.
---------------------------------------- -}
if (force || !g1_policy()->is_young_list_full()) {
{- -------------------------------------------
(1.1) G1CollectedHeap::new_region() で新しい HeapRegion の確保を試みる.
---------------------------------------- -}
HeapRegion* new_alloc_region = new_region(word_size,
false /* do_expand */);
{- -------------------------------------------
(1.1) もし確保が成功していれば,
...#TODO,
G1CollectedHeap::set_region_short_lived_locked() で
新しい HeapRegion を G1CollectedHeap::_young_list 内に記録した後,
確保した HeapRegion をリターン.
(ついでに, G1MonitoringSupport::update_eden_counters() で, JMM 用のカウンタ値のインクリメントも行っている)
---------------------------------------- -}
if (new_alloc_region != NULL) {
g1_policy()->update_region_num(true /* next_is_young */);
set_region_short_lived_locked(new_alloc_region);
g1mm()->update_eden_counters();
return new_alloc_region;
}
}
{- -------------------------------------------
(1) 確保を試みなかった場合, もしくは試みたが失敗した場合には, NULL をリターン.
---------------------------------------- -}
return NULL;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.