Heim >Java >javaLernprogramm >So beheben Sie den Java ThreadLocal-Speicherverlust

So beheben Sie den Java ThreadLocal-Speicherverlust

王林
王林nach vorne
2023-05-18 10:25:051365Durchsuche

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 storage und Entry erben 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. 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen