Pour les langages qui gèrent la mémoire manuellement, tels que C, le garbage collector peut sembler magique. Cependant, il existe toujours des causes de fuites de mémoire, alors soyez prudent.
Exemple 1
//"Fuite de mémoire"Peux-tu le trouver?
public class Stack {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public Stack() {
this.elements = new Object[DEFAULT_INITIAL_CAPACITY];
}
public void push(Object e) {
ensureCapacity();
elements[size++] = e
}
public Object pop() {
if (size == 0)
throw new EmptyStackException();
return elements[--size];
}
/**
*Environ le double de la procédure chaque fois que la matrice doit être agrandie
*Sécurisez au moins la capacité d'un autre élément.
*/
private void ensureCapacity() {
if (elements.length == size)
elements = Array.copyOf(elements, 2 * size + 1);
}
}
Exemple 2
public Object pop() {
if (size==0)
throw new EmptyStackException();
Object result = elements[--size];
elements[size] = null; //Débarrassez-vous des références obsolètes
return result;
}
L'exemple 1 semble correct à première vue, mais contient une référence obsolète. Vous pouvez éviter les fuites de mémoire en définissant null pour les références dont vous n'avez plus besoin comme dans l'exemple 2.
Cependant, vous n'avez pas à le définir excessivement nul pour tous les programmes utilisés. La classe Stack a sa propre gestion de la mémoire. Le garbage collector ne sait pas quelles références dans ces classes sont inutiles. Vous pouvez indiquer efficacement au garbage collector ce qui n'est pas valide en définissant manuellement null.
Une fois que vous avez mis une référence d'objet dans le cache, il est facile d'oublier que la référence d'objet est là, et il est facile de la laisser dans le cache longtemps après que la référence d'objet n'a pas de sens. Si vous souhaitez implémenter un cache qui a du sens pour cette entrée tant qu'il y a une référence à la clé de l'entrée en dehors du cache, alors c'est une bonne idée de représenter ce cache dans un WeakHashMap. WeakHashMap: supprimé automatiquement lorsque les entrées sont obsolètes
Si vous implémentez une API qui ne désinscrit pas explicitement, les rappels s'accumuleront à moins que vous ne fassiez quelque chose. La meilleure façon de vous assurer que vos rappels sont rapidement récupérés est de ne stocker que des références faibles.
[Lire Java efficace] Chapitre 2 Item 7 "Eviter les finaliseurs" https://qiita.com/Natsukii/items/785ae41361cb7324e45b
Recommended Posts