非常に多くのスレッドが 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 がメモリを大量に消費する理由は何ですか?