hotspot/src/share/vm/gc_implementation/g1/g1AllocRegion.inline.hpp
inline HeapWord* G1AllocRegion::attempt_allocation_locked(size_t word_size,
bool bot_updates) {
{- -------------------------------------------
(1) まず, G1AllocRegion::attempt_allocation() でのメモリ確保をもう一度試みる
(この関数は slow path 用なので G1AllocRegion::attempt_allocation() による確保は既に失敗済みのような気もするが,
ロック待ちの間に他のスレッドが領域確保を行い, 現在では成功するようになっているかも知れないため.)
もし確保に成功すればここでリターン.
---------------------------------------- -}
// First we have to tedo the allocation, assuming we're holding the
// appropriate lock, in case another thread changed the region while
// we were waiting to get the lock.
HeapWord* result = attempt_allocation(word_size, bot_updates);
if (result != NULL) {
return result;
}
{- -------------------------------------------
(1) メモリ確保に失敗した場合は, G1AllocRegion::retire() を呼び出して
現在 _alloc_region フィールドに格納している HeapRegion の後始末を行う.
その後, G1AllocRegion::new_alloc_region_and_allocate() での確保を試み, 結果をリターン.
ついでに(トレース出力).
---------------------------------------- -}
retire(true /* fill_up */);
result = new_alloc_region_and_allocate(word_size, false /* force */);
if (result != NULL) {
trace("alloc locked (second attempt)", word_size, result);
return result;
}
trace("alloc locked failed", word_size);
return NULL;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.