Top


定義場所(file name)

hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp

名前(function name)

HeapRegion* G1CollectedHeap::new_mutator_alloc_region(size_t word_size,
                                                      bool force) {

本体部(body)

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