Maison >Java >javaDidacticiel >Comment résoudre la fuite de mémoire Java ThreadLocal

Comment résoudre la fuite de mémoire Java ThreadLocal

王林
王林avant
2023-05-18 10:25:051392parcourir

1. Instance de fuite

Entrée de classe interne statique de 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 utilise la classe interne statique Entry pour implémenter le stockage de référence ThreadLocal Weak.

Parce que ThreadLocalMap utilise la référence faible de ThreadLocal comme clé, lorsque ce ThreadLocal n'a pas de référence forte externe, ce sera GC. A ce moment, une entrée avec une clé nulle apparaîtra dans ThreadLocalMap. Bien entendu, la valeur de cette entrée ne sera jamais accessible.

Dans ce cas, si le thread de travail actuel n'est pas terminé, alors la valeur avec une clé nulle est fortement référencée par Entry, et Entry est fortement référencée par le ThreadLocalMap du thread actuel, ce qui fait que cette valeur n'est jamais GC, ce qui entraîne une fuite de mémoire.

2. Solution

Les méthodes cleanSomeSlots() et expungeStaleEntry() de ThreadLocalMap peuvent effacer les valeurs avec des clés nulles. Dans les méthodes set(), get() et remove() de ThreadLocal, cleanSomeSlots() ou expungeStaleEntry() seront appelées pour effacer toutes les valeurs avec des clés nulles dans ThreadLocalMap.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer