Es gibt eine Methode in Threads, die häufig von allen aufgerufen wird, und das ist ThreadLocal. Bei ThreadLocal treten jedoch auch schwierigere Probleme bei der Speicherverarbeitung auf, und es treten immer einige Speicherlecks auf. In diesem Artikel wird ein Leckbeispiel zur Analyse für jedermann verwendet. Außerdem hilft es Ihnen, einige Situationen im Leck zu verstehen und entsprechende ThreadLocal-Lösungen vorzuschlagen.
1. Beispiele für Leckagen
Statischer innerer Klasseneintrag von ThreadLocalMap:
statischer Klasseneintrag erweitert WeakReference<ThreadLocal<?>> { /** Der diesem ThreadLocal zugeordnete Wert */ Objektwert; Eintrag(ThreadLocal<?> k, Objekt v) { super(k); Wert = v; } }
ThreadLocalMap verwendet die statische interne Klasse Entry, um den <k, v>-Speicher zu implementieren, und Entry erbt die WeakReference-Klasse, sodass der Schlüssel in ThreadLocalMap tatsächlich eine schwache Referenz auf ThreadLocal ist.
Gerade weil ThreadLocalMap die schwache Referenz von ThreadLocal als Schlüssel verwendet, ist es GC, wenn dieses ThreadLocal keine externe starke Referenz hat. Zu diesem Zeitpunkt wird in ThreadLocalMap ein Eintrag mit einem Nullschlüssel angezeigt. Natürlich wird niemals auf den Wert dieses Eintrags zugegriffen.
Wenn in diesem Fall der aktuelle Arbeitsthread nicht beendet wurde, wird der Wert mit einem Nullschlüssel von Entry stark referenziert, und Entry wird von der ThreadLocalMap des aktuellen Threads stark referenziert, was dazu führt, dass dieser Wert nie GCed wird, was zu einem Speicher führt Leck.
2. Lösung
Die Methoden cleanSomeSlots() und expungeStaleEntry() von ThreadLocalMap können Werte mit Nullschlüsseln löschen. In den Methoden set(), get() und remove() von ThreadLocal werden cleanSomeSlots() oder expungeStaleEntry() aufgerufen, um alle Werte mit Nullschlüsseln in der ThreadLocalMap zu löschen.
Das Obige ist die Lösung für den Java ThreadLocal-Speicherverlust. Dies kann natürlich nur eine gewisse Rolle bei Speicherverlusten spielen. Schließlich ist es nur eine Art Klarheit und es gibt keine Garantie dafür, dass er nicht auftritt .