[Lire Java efficace] Chapitre 2 Item 6 "Supprimer les références d'objets obsolètes"

Débarrassez-vous des références d'objets obsolètes

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 de code

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;
}

Trois causes de fuites de mémoire

Tout d'abord, une référence obsolète

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.

Deuxième argent

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

Troisième auditeur et rappel

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.

Continuer

[Lire Java efficace] Chapitre 2 Item 7 "Eviter les finaliseurs" https://qiita.com/Natsukii/items/785ae41361cb7324e45b

Recommended Posts

[Lire Java efficace] Chapitre 2 Item 6 "Supprimer les références d'objets obsolètes"
[Effective Java] Supprimer les références d'objet obsolètes
[Lire Java efficace] Chapitre 2 Item 7 "Eviter les finaliseurs"
[Lire Java efficace] Chapitre 3 Item 10 "Always Override toString"
[Lire Java efficace] Chapitre 3 Point 12 "Considérer l'implémentation de Comparable"
Efficace Java Chapitre 2
[Lire Java efficace] Chapitre 2 Item 4 "Forcer l'impossibilité d'immobilisation avec un constructeur privé"
Effective Java Chapitre 6 34-35
[Lire Java effectif] Chapitre 3 Rubrique 9 "Lors de la substitution d'égaux, toujours remplacer hashCode"
Effective Java Chapitre 4 15-22
[Lire Java efficace] Chapitre 2 Item 5 "Eviter la création d'objets inutiles"
Java efficace Chapitre 3
[Lire Java efficace] Chapitre 2 Item 1 "Considérez les méthodes de fabrique statiques plutôt que les constructeurs"
[Lire Java efficace] Chapitre 3 Point 8 "En cas de remplacement égal, suivez le contrat général"
Effective Java 3rd Edition Chapitre 2 Création et disparition d'objets
[Lire Java efficace] Chapitre 2 Item 3 "Forcer les caractéristiques de singleton avec un constructeur privé ou un type enum"
Efficacité de Java 3rd Edition Chapitre 5 Génériques
Méthodes efficaces du chapitre 8 de Java 3rd Edition
[Lire le Java efficace] Chapitre 2 Item 2 "Considérez un constructeur face à un grand nombre de paramètres de constructeur"
Effective Java 3rd Edition Chapitre 9 Programme Général
Java (supprimer)
Enum et annotations du chapitre 6 de Java 3rd Edition efficace
Efficacité de Java 3rd Edition Chapitre 4 Classes et interfaces
Efficace Java 3e édition Chapitre 7 Lambda et Stream