1. Was ist ein Speicherverlust?
Definition von Speicherverlust: Objekte werden von der Anwendung nicht mehr verwendet, aber der Garbage Collector kann sie nicht löschen, da sie referenziert werden.
Um diese Definition zu verstehen, müssen wir den Zustand von Objekten im Gedächtnis verstehen.
Das Bild unten zeigt, welche unbenutzt sind und welche nicht referenziert sind.
Im Diagramm gibt es referenzierte Objekte und nicht referenzierte Objekte.
Nicht referenzierte Objekte werden durch Garbage Collection erfasst, während referenzierte Objekte nicht durch Garbage Collection erfasst werden.
Ein nicht referenziertes Objekt ist definitiv unbenutzt, da kein anderes Objekt darauf verweist.
Allerdings sind nicht alle nicht verwendeten Objekte nicht referenziert.
Einige davon werden referenziert!
Daher kommt der Speicherverlust.
2. Warum tritt ein Speicherverlust auf?
Schauen wir uns das folgende Beispiel an, um zu sehen, warum ein Speicherverlust auftritt.
Im Beispiel unten bezieht sich Objekt A auf Objekt B. Die Lebensdauer von A (t1 – t4) ist viel länger als die Lebensdauer von B (t2 – t3).
Wenn B in der Anwendung nicht mehr verwendet wird, enthält A immer noch einen Verweis darauf.
Auf diese Weise kann der Garbage Collector B nicht aus dem Speicher löschen.
Dies kann zu Problemen mit nicht genügend Arbeitsspeicher führen, denn wenn A den gleichen Vorgang für mehr Objekte ausführt, gibt es viele nicht erfasste Objekte und verbraucht Speicherplatz.
Es ist auch möglich, dass B eine Reihe von Verweisen auf andere Objekte enthält. Die durch
B referenzierten Objekte werden ebenfalls nicht erfasst.
Alle diese ungenutzten Objekte verbrauchen wertvollen Speicherplatz.
3. So verhindern Sie Speicherlecks
Hier sind einige schnelle praktische Tipps, um Speicherlecks zu verhindern:
Achten Sie auf Sammlungsklassen wie HashMap, ArrayList usw., da sie häufig Speicherorte sind Es werden Lecks gefunden.
Wenn sie als statisch deklariert sind, entspricht ihr Lebenszyklus dem Lebenszyklus der Anwendung.
Achten Sie auf Ereignis-Listener und Rückrufe. Ein Speicherverlust kann auftreten, wenn ein Listener registriert, aber nicht abgemeldet ist, wenn die Klasse nicht mehr verwendet wird.
Wenn eine Klasse ihren eigenen Speicher verwaltet, sollten Programmierer vor Speicherlecks auf der Hut sein.
[1] Mitgliedsvariablen von Objekten, die häufig multipliziert werden, um auf andere Objekte zu verweisen, müssen null sein.
Das obige ist der detaillierte Inhalt vonSo verhindern Sie Speicherlecks in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!