私は、概念を明確に説明する包括的な情報源を見つけることができませんでした。私の理解では、スレッドに新しいオブジェクトを割り当てるedenのメモリが与えられます。競合するスレッドは、やや連続したedenのチャンクを持つことになります。最初のスレッドのTLABの空き領域がなくなったらどうなりますか?それはエデンの新しい塊を要求するでしょうか?TLAB(Thread Local Allocation Buffer)とは何ですか?
答えて
TLABの考えは、スレッド間の同期の必要性を減らすことです。 TLABを使用すると、どのスレッドも使用できる領域があり、この領域を使用する唯一のスレッドであると予想されるため、この必要性は低減されます。 TLABが100個のオブジェクトを保持できると仮定すると、スレッドは、101個のオブジェクトを割り当てるときに、より多くのメモリを要求するためにロックを取得する必要があります。 TLABがなければ、これはすべてのオブジェクトに必要です。欠点はもちろん、スペースを無駄にする可能性があることです。
ラージオブジェクトは、通常、同期メモリ割り当ての頻度を減らすという利点を無効にするため、TLABの外部に割り当てられます。一部のオブジェクトは、TLABの内部にも収まらない場合があります。
-XX:TLABSize
フラグを使用してTLABのサイズを設定できますが、実際に解決できる問題が見つからない限り、これらの設定を混乱させることはお勧めできません。
ありがとうございます。 1)スレッドがTLABを割り当てるとき、競合するスレッドが最初のスレッドと同じ領域にTLABを割り当てないように、ロックを取得する必要があります。その仮定は正しいのでしょうか? 2)TLABの外にオブジェクトを割り当てることは、TLABに収まらない新しいオブジェクトを割り当てるためにロックを取得する必要があるため、常に高価ですか? – user1745356
スレッド1はオフセット0〜99のTLABを要求し、スレッド2はオフセット100〜199を要求します。契約書によると、スレッド2は0〜99で割り当てられず、スレッド1は100〜199で割り当てられません。スレッドは、この空間を将来の割り当てバッファとして要求することもできない。この方法では、各オブジェクトが仮想スロットの1つを取る場合、各スレッドは同期せずに100個のオブジェクトを割り当てることができます。 TLABの外部に割り当てることはそれほど高価ではありませんが、同時に実行する可能性のある他のスレッドとの通信を必要とするため、明らかにTLAB内よりも高価です。 –
申し訳ありませんが、私の質問が明確でない場合、私は別の方法を入れようとします - 競合する2つのスレッドが次の100個のオブジェクトにメモリを割り当て、次の使用可能なメモリアドレスが100から始まり、ロックは100〜199のアドレスを取得し、2番目のスレッドは200〜299を取得します。これは正しいですか? – user1745356
- 1. Kakouneの "* debug * buffer"とは何ですか?
- 2. 'Thread of instruction'と 'Thread of control'の違いは何ですか?
- 3. Java2D Disposer Threadとは何ですか?
- 4. Android outofmemory error allocation
- 5. boost :: signals2 :: mutexとboost :: thread :: mutexの違いは何ですか?
- 6. emacsの "abort"と "terminate-thread"の違いは何ですか?
- 7. Matrix4の "World Transform"と "Local Transform"の違いは何ですか?
- 8. BASE、LOCAL、REMOTE、およびcppMergedファイルとは何ですか?
- 9. Java NIO Bufferクラスの主な用途は何ですか?
- 10. elisp式(1+(buffer-size))と(+ 1(buffer-size))はどういう意味ですか?
- 11. std :: string allocation policy
- 12. `yarn.scheduler.maximum-allocation-mb`と` yarn.nodemanager.resource.memory-mb`の違いは?
- 13. tlab音声変換
- 14. "IBM Watson IoT Platform Local"は "Bluemix Local"と同じものですか?
- 15. boost :: threadはスレッドセーフですか?
- 16. ブラウザスタックローカルでは、 '--proxy-host'と '--local-proxy-host'の違いは何ですか?
- 17. マトリックスからcsv matlabへのセル
- 18. HandlersとThreadの実際のパフォーマンスに何か影響はありますか?
- 19. `go install`、` govendor install + local`と `govendor install + vendor、^ program`の違いは何ですか?
- 20. lambdaの[&捕獲]と[&local =捕獲]の捕獲の違いは何ですか?
- 21. Mapped Buffer Pool/Direct Buffer Poolとはどのようにしてサイズを増やすのですか?
- 22. Javaは "Thread"に何かを "bind"します
- 23. ThreadLocalはTLABに割り当てられていますか?
- 24. purge-local-repositoryは実際には何をパージしますか?
- 25. MinGWとstd :: thread
- 26. boost :: threadとメモリモデル
- 27. `e.what()`は "bad allocation"を出力しますか?
- 28. Java:synchronized buffer
- 29. redisのrepl-bufferとbacklogの違いは?
- 30. Djangoの "expected string or buffer"エラーは何を示していますか?
あなたの最後の質問については、新しいTLABがスレッドに割り当てられると思います。単純な最適化のように小さなメモリの代わりにTLABを割り当てると、ロックを必要とせずに頻繁な作業スレッドをローカルにすることを考えてください。 – maaartinus