2 Stimmen

Sehr viele ThreadLocalMap-Einträge im Speicher

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?

1voto

andersoj Punkte 21576

Können Sie herausfinden, was die Werte in der Thread Local Map sind? Haben Sie sich mit jhat oder ähnliches, um zu sehen, worauf sie sich beziehen?

1voto

sehugg Punkte 3575

0voto

Stephen C Punkte 665668

Das Problem scheint die tatsächliche Anzahl der Thread-Locals zu sein, nicht die Werte, die sie enthalten.

Ich vermute, dass Sie ThreadLocal falsch verwenden. Die ThreadLocal Objekt sollte (einmalig) erstellt und einem static Variable, wie im Beispiel in die Javadoku .

Wenn Sie die ThreadLocal Objekt im Initialisierer einer nicht statischen Variablen, dann erhalten Sie jedes Mal, wenn die Variablendeklaration ausgeführt wird, einen neuen Thread local. Wenn Sie dies mit Thread-Pooling kombinieren, erhalten Sie eine Menge nutzloser Thread-Local-Map-Einträge.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X