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
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!