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.
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;
}
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.
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
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.
[Read Effective Java] Kapitel 2 Punkt 7 "Vermeiden Sie Finalizer" https://qiita.com/Natsukii/items/785ae41361cb7324e45b
Recommended Posts