[Read Effective Java] Kapitel 2 Punkt 6 "Veraltete Objektreferenzen entfernen"

Veraltete Objektreferenzen entfernen

Bei Sprachen, die den Speicher manuell verwalten, wie z. B. C, sieht der Garbage Collector möglicherweise magisch aus. Es gibt jedoch immer noch Ursachen für Speicherlecks. Seien Sie also vorsichtig.

Beispielcode

Beispiel 1


//"Speicherleck"Kannst du es finden?
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];
    }

    /**
     *Verdoppeln Sie die Prozedur jedes Mal ungefähr, wenn das Array vergrößert werden muss
     *Sichern Sie mindestens die Kapazität eines anderen Elements.
     */ 
    private void ensureCapacity() {
        if (elements.length == size)
            elements = Array.copyOf(elements, 2 * size + 1);
    }
}

Beispiel 2


public Object pop() {
    if (size==0)
        throw new EmptyStackException();
    Object result = elements[--size];
    elements[size] = null; //Veraltete Referenzen loswerden
    return result;
}

Drei Ursachen für Speicherlecks

Erstens veraltete Referenz

Beispiel 1 sieht auf den ersten Blick gut aus, enthält jedoch eine veraltete Referenz. Sie können Speicherverluste verhindern, indem Sie für Referenzen, die Sie nicht mehr benötigen, wie in Beispiel 2, null setzen.

Sie müssen es jedoch nicht für alle verwendeten Programme übermäßig auf Null setzen. Die Stack-Klasse verfügt über eine eigene Speicherverwaltung. Der Garbage Collector weiß nicht, welche Referenzen in solchen Klassen nicht erforderlich sind. Sie können dem Garbage Collector effektiv mitteilen, was ungültig ist, indem Sie manuell null setzen.

Zweites Geld

Sobald Sie eine Objektreferenz in den Cache eingefügt haben, können Sie leicht vergessen, dass die Objektreferenz vorhanden ist, und Sie können sie leicht im Cache belassen, lange nachdem die Objektreferenz bedeutungslos ist. Wenn Sie einen Cache implementieren möchten, der für diesen Eintrag sinnvoll ist, solange ein Verweis auf den Schlüssel des Eintrags außerhalb des Caches vorhanden ist, wird dieser Cache am besten in einer WeakHashMap dargestellt. WeakHashMap: Wird automatisch entfernt, wenn Einträge veraltet sind

Dritter Zuhörer und Rückruf

Wenn Sie eine API implementieren, die die Registrierung nicht explizit aufhebt, werden Rückrufe akkumuliert, sofern Sie nichts unternehmen. Der beste Weg, um sicherzustellen, dass Ihre Rückrufe schnell gesammelt werden, besteht darin, nur schwache Verweise darauf zu speichern.

Fortsetzen

[Read Effective Java] Kapitel 2 Punkt 7 "Vermeiden Sie Finalizer" https://qiita.com/Natsukii/items/785ae41361cb7324e45b

Recommended Posts

[Read Effective Java] Kapitel 2 Punkt 6 "Veraltete Objektreferenzen entfernen"
[Effektives Java] Veraltete Objektreferenzen entfernen
[Read Effective Java] Kapitel 2 Punkt 7 "Vermeiden Sie Finalizer"
[Read Effective Java] Kapitel 3 Punkt 10 "Immer toString überschreiben"
[Read Effective Java] Kapitel 3 Punkt 12 "Berücksichtigung der Implementierung von Comparable"
Effektives Java Kapitel 2
[Read Effective Java] Kapitel 2 Punkt 4 "Unmöglichkeit der Instanziierung mit privatem Konstruktor erzwingen"
Effektives Java Kapitel 6 34-35
[Read Effective Java] Kapitel 3 Punkt 9 "Wenn Sie equals überschreiben, überschreiben Sie immer hashCode"
Effektives Java Kapitel 4 15-22
[Read Effective Java] Kapitel 2 Punkt 5 "Vermeiden Sie die Erstellung unnötiger Objekte"
Effektives Java Kapitel 3
[Read Effective Java] Kapitel 2 Punkt 1 "Betrachten Sie statische Factory-Methoden anstelle von Konstruktoren"
[Read Effective Java] Kapitel 3 Punkt 8 "Wenn Sie gleich überschreiben, befolgen Sie den allgemeinen Vertrag"
Effektive Java 3rd Edition Kapitel 2 Objekterstellung und Verschwindenlassen
[Read Effective Java] Kapitel 2 Punkt 3 "Singleton-Eigenschaften mit privatem Konstruktor oder Aufzählungstyp erzwingen"
Effektive Java 3rd Edition Kapitel 5 Generika
Effektive Java 3rd Edition Kapitel 8 Methoden
[Read Effective Java] Kapitel 2 Punkt 2 "Betrachten Sie einen Builder, wenn Sie mit einer großen Anzahl von Konstruktorparametern konfrontiert werden."
Effektives Java 3rd Edition Kapitel 9 Programm Allgemein
Java (entfernen)
Effektive Java 3rd Edition Kapitel 6 Aufzählung und Anmerkungen
Effektive Java 3rd Edition Kapitel 4 Klassen und Schnittstellen
Effektive Java 3rd Edition Kapitel 7 Lambda und Stream