Nehmen wir eine sehr große Java-VM mit sehr vielen Threads, auf der ein Webserver läuft.
Betrachten wir nun ein Beispiel für die Ausgabe, die von jmap -histo
die in etwa so aussieht:
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
Wenn Sie die Division durchführen, ergibt sich, dass wir 256 Instanzen von java.lang.ThreadLocal$ThreadLocalMap$Entry
pro Thema. Das ist eine ziemlich hohe Zahl und mehr, als ich erwarten würde, wenn man bedenkt, dass die meisten ThreadLocals nicht sehr viele Werte speichern sollten. In Tomcat sehe ich nicht so viele, wenn ich die ThreadLocal-Leck-Erkennungsfunktion verwende.
Gibt es einen Grund, warum diese ThreadLocalMaps so speicherhungrig sein sollten?