2017-05-02 30 views
11

私は、概念を明確に説明する包括的な情報源を見つけることができませんでした。私の理解では、スレッドに新しいオブジェクトを割り当てるedenのメモリが与えられます。競合するスレッドは、やや連続したedenのチャンクを持つことになります。最初のスレッドのTLABの空き領域がなくなったらどうなりますか?それはエデンの新しい塊を要求するでしょうか?TLAB(Thread Local Allocation Buffer)とは何ですか?

+0

あなたの最後の質問については、新しいTLABがスレッドに割り当てられると思います。単純な最適化のように小さなメモリの代わりにTLABを割り当てると、ロックを必要とせずに頻繁な作業スレッドをローカルにすることを考えてください。 – maaartinus

答えて

15

TLABの考えは、スレッド間の同期の必要性を減らすことです。 TLABを使用すると、どのスレッドも使用できる領域があり、この領域を使用する唯一のスレッドであると予想されるため、この必要性は低減されます。 TLABが100個のオブジェクトを保持できると仮定すると、スレッドは、101個のオブジェクトを割り当てるときに、より多くのメモリを要求するためにロックを取得する必要があります。 TLABがなければ、これはすべてのオブジェクトに必要です。欠点はもちろん、スペースを無駄にする可能性があることです。

ラージオブジェクトは、通常、同期メモリ割り当ての頻度を減らすという利点を無効にするため、TLABの外部に割り当てられます。一部のオブジェクトは、TLABの内部にも収まらない場合があります。

-XX:TLABSizeフラグを使用してTLABのサイズを設定できますが、実際に解決できる問題が見つからない限り、これらの設定を混乱させることはお勧めできません。

+0

ありがとうございます。 1)スレッドがTLABを割り当てるとき、競合するスレッドが最初のスレッドと同じ領域にTLABを割り当てないように、ロックを取得する必要があります。その仮定は正しいのでしょうか? 2)TLABの外にオブジェクトを割り当てることは、TLABに収まらない新しいオブジェクトを割り当てるためにロックを取得する必要があるため、常に高価ですか? – user1745356

+1

スレッド1はオフセット0〜99のTLABを要求し、スレッド2はオフセット100〜199を要求します。契約書によると、スレッド2は0〜99で割り当てられず、スレッド1は100〜199で割り当てられません。スレッドは、この空間を将来の割り当てバッファとして要求することもできない。この方法では、各オブジェクトが仮想スロットの1つを取る場合、各スレッドは同期せずに100個のオブジェクトを割り当てることができます。 TLABの外部に割り当てることはそれほど高価ではありませんが、同時に実行する可能性のある他のスレッドとの通信を必要とするため、明らかにTLAB内よりも高価です。 –

+0

申し訳ありませんが、私の質問が明確でない場合、私は別の方法を入れようとします - 競合する2つのスレッドが次の100個のオブジェクトにメモリを割り当て、次の使用可能なメモリアドレスが100から始まり、ロックは100〜199のアドレスを取得し、2番目のスレッドは200〜299を取得します。これは正しいですか? – user1745356

関連する問題