hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp
void ThreadLocalAllocBuffer::resize() {
{- -------------------------------------------
(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.