Top


定義場所(file name)

hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp

名前(function name)

void ThreadLocalAllocBuffer::resize() {

本体部(body)

  {- -------------------------------------------
  (1) ResizeTLAB オプションが指定されていない場合には, この関数では何も行わない.
      ---------------------------------------- -}

      if (ResizeTLAB) {

  {- -------------------------------------------
  (1) TLAB の最適な大きさを計算する (以下の aligned_new_size), 

      なお, TLAB の最適な大きさは以下のように計算する.
        (1) まず, 「次の GC までの間に, このスレッドが TLAB として確保する量」の予測値を計算する (以下の alloc).
            この量は, 「TLAB として利用されうる最大長」に
            「全 TLAB 量のなかに占める, このスレッドが確保する TLAB 量の割合」を掛けて求める.

            それぞれの量は以下のようにして求める.
              * 「TLAB として利用されうる最大長」
                CollectedHeap::tlab_capacity() で取得 (この数値は典型的には Eden 領域長).
              * 「全 TLAB 量のなかに占める, このスレッドが確保する TLAB 量の割合」
                _allocation_fraction に溜まっている過去の実績値を使用する.

        (2) 次に, 1つの TLAB の理想量を計算する (以下の new_size).
            この量は, 上の alloc 量を「理想とする TLAB 確保操作の回数(_target_refills の値)」 で割ることで求める.

        (3) もし new_size が ThreadLocalAllocBuffer::min_size() より小さかったり
            あるいは ThreadLocalAllocBuffer::max_size() より大きかった場合は, 
            それぞれ ThreadLocalAllocBuffer::min_size()/ThreadLocalAllocBuffer::max_size() に切り詰める.

        (4) 以上で計算した値を, align_object_size() を用いて
            最小オブジェクトサイズにアラインしたものを aligned_new_size とする.
      ---------------------------------------- -}

        // Compute the next tlab size using expected allocation amount
        size_t alloc = (size_t)(_allocation_fraction.average() *
                                (Universe::heap()->tlab_capacity(myThread()) / HeapWordSize));
        size_t new_size = alloc / _target_refills;

        new_size = MIN2(MAX2(new_size, min_size()), max_size());

        size_t aligned_new_size = align_object_size(new_size);

  {- -------------------------------------------
  (1) (トレース出力)
      ---------------------------------------- -}

        if (PrintTLAB && Verbose) {
          gclog_or_tty->print("TLAB new size: thread: " INTPTR_FORMAT " [id: %2d]"
                              " refills %d  alloc: %8.6f desired_size: " SIZE_FORMAT " -> " SIZE_FORMAT "\n",
                              myThread(), myThread()->osthread()->thread_id(),
                              _target_refills, _allocation_fraction.average(), desired_size(), aligned_new_size);
        }

  {- -------------------------------------------
  (1) ThreadLocalAllocBuffer::set_desired_size() で, 
      計算した最適サイズを ThreadLocalAllocBuffer::desired_size() に設定する.
      (この ThreadLocalAllocBuffer::desired_size() が
       TLAB 確保時に確保サイズの決定に使われる値.
       See: ThreadLocalAllocBuffer::compute_size())
      ---------------------------------------- -}

        set_desired_size(aligned_new_size);

  {- -------------------------------------------
  (1) ThreadLocalAllocBuffer::refill_waste_limit() の値を初期値に戻しておく.
      (See: CollectedHeap::allocate_from_tlab_slow())
      ---------------------------------------- -}

        set_refill_waste_limit(initial_refill_waste_limit());
      }
    }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.