2

非常に多くのスレッドが Web サーバーを実行している非常に大きな Java VM を考えてみましょう。

によって生成された出力のサンプルは、次のjmap -histoようになります。

  4:       5989163      191653216  java.lang.ThreadLocal$ThreadLocalMap$Entry
 10:         46786       49012000  [Ljava.lang.ThreadLocal$ThreadLocalMap$Entry;
 86:         23384        2619008  java.lang.Thread
144:         46750        1122000  java.lang.ThreadLocal$ThreadLocalMap

除算を行うと、java.lang.ThreadLocal$ThreadLocalMap$Entryスレッドごとに 256 のインスタンスがあることがわかります。ほとんどの ThreadLocals が大量の値を格納するべきではないことを考えると、予想以上に高い数字です。ThreadLocal-leak-detection 機能を使用すると、Tomcat にはそれほど多くは表示されません。

これらの ThreadLocalMaps がメモリを大量に消費する理由は何ですか?

4

3 に答える 3

1

スレッドローカルマップの値が何であるかを理解できますか?jhat彼らが何を参照しているのかを見るために、それと同等のものをいじくり回しましたか?

于 2010-10-21T05:18:51.720 に答える
1

このバグが発生している可能性があります:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6625723

于 2010-10-21T14:43:27.457 に答える
0

問題は、含まれている値ではなく、スレッド ローカルの実際の数にあるようです。

ThreadLocal を間違って使用している可能性があります。javadocの例に示すように、オブジェクトを (1 回) 作成し、変数にThreadLocal割り当てる必要があります。 static

非静的変数の初期化子でオブジェクトを作成するとThreadLocal、変数宣言が実行されるたびに、新しいスレッド ローカルが取得されます。これをスレッド プーリングと組み合わせると、無駄なスレッド ローカル マップ エントリが大量に発生します。

于 2010-10-21T05:54:52.717 に答える