Heim >Java >javaLernprogramm >So beheben Sie den Java ThreadLocal-Speicherverlust
1. Leak-Instanz
Statischer innerer Klasseneintrag von ThreadLocalMap:
static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal<?> k, Object v) { super(k); value = v; } }
ThreadLocalMap verwendet den statischen inneren Klasseneintrag, um
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. Auf den Wert dieses Eintrags wird natürlich nie 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 Der Wert kann niemals GC sein, was zu Speicherverlusten führt.
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 der detaillierte Inhalt vonSo beheben Sie den Java ThreadLocal-Speicherverlust. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!