Was sind Speicherlecks in der Android-Entwicklung?
Die Anwendung erstellt Objekte, sie liegen im Speicher und können sie nach Abschluss ihrer Arbeit nicht löschen.
Warum passiert das?
Java hat seine eigenen Möglichkeiten, den Speicher unbenutzter Elemente zu löschen. Dies ist Garbage Collection .
Der Garbage Collector markiert alle Objekte, die gelöscht werden können, wenn sie nicht referenziert werden. Ein Speicherleck ist einfach eine verlorene Referenz, die darauf hinweist, dass das Objekt nicht gelöscht werden kann.
Die Komplexität dieses Fehlers
besteht darin, dass er bis zu einem bestimmten Zeitpunkt nicht sichtbar ist und nicht stören kann.
Es gibt ein gutes Zitat von Benjamin Franklin: „Ein kleines Leck wird ein großes Schiff versenken.“
Speicherlecks nehmen den Arbeitsspeicher der Anwendung in Anspruch. Der Rohspeicher wächst und eines Tages kann Ihre Anwendung
langsamer werden und abstürzen
. Dies führt zu Unzufriedenheit bei den Benutzern und höchstwahrscheinlich wird die Anwendung entfernt ...
Einer der
gefährlichsten
Fälle, in denen das Programm die Verbindung zu
view
verliert. Es scheint, dass diese
Ansicht
auf dem Bildschirm klein ist. Es sei jedoch daran erinnert, dass
Ansicht
einen Verweis auf
Aktivität
(Fragment) hat. Und wenn der Link zum Anzeigen nicht entfernt wird, ist die Aktivität (Fragment) ebenfalls aktiv. Eine Aktivität (Fragment) hat Links zu allen Ansichten auf dem Bildschirm.
Woher weiß ich, ob es Speicherlecks gibt?
Sie können Leakeys Erinnerung auf verschiedene Arten finden. Am einfachsten ist es jedoch, Profiler Android Studio zu verwenden.
Verfahren:
- Projekt starten
- Klicken Sie in der unteren Leiste auf Profiler.
- Wählen Sie "Speicher"
- Drücken Sie "Force Garbage Collection" (dann müssen Sie etwas warten)
- Klicken Sie auf "Java-Heap-Dump".
- Filtern Sie die Liste nach den gewünschten Klassen
- Zeigen Sie die Anzahl der Objekte an
Die obige Abbildung zeigt, dass es vier Aktivitäts -Objekte gibt. Dies geschah, weil der Programmierer dem Programm erlaubte, Verweise auf view zu verlieren. Und Benutzer lieben es, den Telefonbildschirm zu drehen. Mit jedem Orientierungswechsel wurde die Tätigkeit neu erschaffen, und die alte blieb in den Tiefen der Erinnerung liegen.
Wenn Sie einen interessanteren Weg zum Aufspüren von Speicherlecks suchen, dann schlage ich vor, dass Sie sich mit der Bibliothek LeakCanary vertraut machen.
Wie vermeide ich Speicherlecks?
Hier sind einige Tipps:
eines. Erstellen Sie keine statischen Links zu Ansichten. Statische Felder haben denselben Lebenszyklus wie Ihre Anwendung.
2. Übergeben Sie keine Verweise auf Objekte, die länger leben als das von Ihnen übergebene Objekt. Zum Beispiel: Übergeben Sie keine Runnable -Verweise auf View an die Klasse, da der neue Thread dies weiterhin tun wird leben, auch nachdem die Aktivität neu erstellt wurde.
public class LeakingRunnable implements Runnable { private View view; LeakingRunnable(View view){ //don't do that! this.view = view; } @Override public void run() { // do some work } }
Und wie verschiebt man view zu Runnable ?
Verwenden Sie andere Arten von Links.
In Java gibt es neben den üblichen
"harten Links"
noch andere
"weiche Links"
und
"schwache"
. Nennen Sie sie richtig:
- Schwache Referenz
- SoftReferenz
- Phantomreferenz
Das Vorhandensein von "weichen Referenzen" hindert den Garbage Collector nicht mehr daran, die Aktivität zu löschen. Sie können hier mehr darüber lesen: Unterschiede zwischen schwachen, weichen, Phantom- und normalen Links in Java
Ohne Speicherlecks würde der obige Code so aussehen:
public class NoLeakingRunnable implements Runnable { @NonNull private final WeakReference<View> viewRef; public NoLeakingRunnable(@NonNull View view){ this.viewRef = new WeakReference<>(view); //do that! } @Override public void run() { View view = viewRef.get(); // do some work } }
3. Es ist notwendig, innere Klassen zu einer statischen Aktivität zu machen.
Die innere Aktivitätsklasse über den Zugriff auf die Ansicht (und alle anderen Objekte) erstellt synthetische Verweise auf dieses Objekt. Und wenn die innere Klasse länger lebt als die Aktivität, dann tritt ein Speicherleck auf.
In diesem Artikel wurde nur ein kleiner Teil der Informationen darüber erzählt, was ein Speicherleck in der Android-Entwicklung ist und wie man es am einfachsten vermeidet. Es gibt noch viel mehr schwierige Situationen. Einige von ihnen werden in zukünftigen Artikeln besprochen. Abonnieren Sie neue Artikel.