
Il existe une méthode dans les threads qui est fréquemment appelée par tout le monde, à savoir ThreadLocal. Cependant, ThreadLocal rencontrera également des problèmes plus difficiles dans le traitement de la mémoire, et des fuites de mémoire se produiront toujours. Cet article utilisera un exemple de fuite à analyser pour tout le monde, et vous aidera également à comprendre certaines situations de fuite et à proposer des solutions ThreadLocal correspondantes.
1. Exemples de fuites
Entrée de classe interne statique de ThreadLocalMap :
classe statique Entry extends WeakReference<ThreadLocal<?>> {
/** La valeur associée à ce ThreadLocal */
Valeur de l'objet ;
Entrée(ThreadLocal<?> k, Objet v) {
super(k);
valeur = v ;
}
}ThreadLocalMap utilise la classe interne statique Entry pour implémenter le stockage <k, v>, et Entry hérite de la classe WeakReference, donc la clé dans ThreadLocalMap est en fait une référence faible à ThreadLocal.
Précisément 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 GCed, provoquant une mémoire fuir.
2. Solutions
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 la solution à la fuite de mémoire Java ThreadLocal. Bien sûr, cela ne peut jouer qu'un certain rôle dans les fuites de mémoire. Après tout, ce n'est qu'une sorte de clarté et il n'y a aucune garantie que cela ne se produira pas .