Top


定義場所(file name)

hotspot/src/share/vm/gc_implementation/g1/g1AllocRegion.inline.hpp

名前(function name)

inline HeapWord* G1AllocRegion::attempt_allocation_locked(size_t word_size,
                                                          bool bot_updates) {

本体部(body)

  {- -------------------------------------------
  (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.