Heap-Dump erfassen

Erstellen Sie einen Heap-Dump, um zu sehen, welche Objekte in Ihrer App Arbeitsspeicher Zeitpunkt der Erfassung und Identifizierung von Speicherlecks oder Speicherzuweisungsverhalten das zu Ruckeln, Einfrieren und sogar App-Abstürzen führt. Es ist besonders hilfreich, Heap-Dumps nach einer längeren Nutzersitzung zu erstellen, da dann Objekte im Arbeitsspeicher angezeigt werden können, die dort nicht mehr sein sollten.

Auf dieser Seite werden die Tools von Android Studio zum Erfassen und und analysieren Heap-Dumps. Alternativ können Sie den App-Speicher über die Befehlszeile mit dumpsys prüfen und sich GC-Ereignisse (Garbage Collection) in Logcat ansehen.

Warum Sie ein Profil für den App-Arbeitsspeicher erstellen sollten

Android bietet eine verwaltete Speicherumgebung: Wenn Android feststellt, dass Ihre App einige Objekte nicht mehr verwendet, gibt der Garbage Collector den nicht verwendeten Arbeitsspeicher wieder an den Heap frei. Die Art und Weise, wie Android ungenutzten Arbeitsspeicher findet, wird ständig verbessert. Bei allen Android-Versionen muss der Code jedoch irgendwann kurz pausiert werden. Meistens sind die Pausen nicht wahrnehmbar. Wenn Ihre App jedoch Arbeitsspeicher schneller zuweist, als das System ihn erfassen kann, kann es zu Verzögerungen bei Ihrer App kommen, während der Profiler genügend Arbeitsspeicher freigibt, um Ihre Zuweisungen zu erfüllen. Diese Verzögerung könnte dazu führen, dass deine App Frames überspringt sichtbare Langsamkeit.

Auch wenn Ihre App nicht langsam läuft, kann sie bei Speicherlecks Arbeitsspeicher belegen, auch wenn sie im Hintergrund ausgeführt wird. Dieses Verhalten kann die Arbeitsspeicherleistung des restlichen Systems beeinträchtigen, da unnötige Garbage-Collection-Ereignisse erzwungen werden. Letztendlich ist das System gezwungen, Ihren App-Prozess zu beenden, um den Arbeitsspeicher wieder freizugeben. Wenn der Nutzer dann zu Ihrer App zurückkehrt, muss der App-Prozess vollständig neu gestartet werden.

Informationen zu Programmierpraktiken, die den Arbeitsspeicher deiner App verringern können finden Sie unter App-Speicher verwalten.

Heap-Dumps – Übersicht

Um einen Heap-Dump zu erfassen, wählen Sie die Aufgabe Arbeitsspeichernutzung analysieren (Heap-Dump) aus Verwenden Sie Profiler: run 'app' as debuggable (complete data), um einen Heap zu erfassen. Dump. Während des Heap-Dumps kann sich der Java-Speicher vorübergehend erhöhen. Das ist normal, da der Heap-Dump im selben Prozess wie Ihre App ausgeführt wird und für die Erhebung der Daten etwas Arbeitsspeicher benötigt. Nachdem Sie den Heap-Dump erfasst haben, sehen Sie Folgendes:

Die Kursliste enthält die folgenden Informationen:

  • Allocations: Anzahl der Zuweisungen im Heap.
  • Native Größe: Die Gesamtmenge des nativen Arbeitsspeichers, der von diesem Objekttyp verwendet wird (in Byte). Hier sehen Sie Arbeitsspeicher für einige in Java zugewiesene Objekte, Android nutzt nativen Arbeitsspeicher für einige Framework-Klassen, z. B. Bitmap

  • Flache Größe: Gesamtmenge des von diesem Objekttyp verwendeten Java-Arbeitsspeichers (in Bytes).

  • Behaltene Größe: Die Gesamtgröße des Arbeitsspeichers, der aufgrund aller Instanzen dieser Klasse belegt ist (in Byte).

Verwenden Sie das Heap-Menü, um nach bestimmten Heaps zu filtern:

  • App-Heap (Standard): Der primäre Heap, dem Ihre App Arbeitsspeicher zuweist.
  • Image-Heap: Das System-Boot-Image mit vorab geladenen Klassen. während des Bootvorgangs. Zuweisungen hier werden nie verschoben oder entfernt.
  • Zygote-Heap: Der Copy-on-Write-Heap, aus dem ein App-Prozess verzweigt wird das Android-System.

Wählen Sie im Drop-down-Menü „Anordnung“ aus, wie die Zuweisungen angeordnet werden sollen:

  • Nach Kurs anordnen (Standardeinstellung): Alle Zuweisungen werden nach Kursnamen gruppiert.
  • Nach Paket sortieren: Hier werden alle Zuweisungen nach Paketnamen gruppiert.

Über das Drop-down-Menü „Kurs“ können Sie nach Gruppen von Kursen filtern:

  • Alle Klassen (Standard): Hier werden alle Klassen angezeigt, einschließlich derjenigen aus Bibliotheken und Abhängigkeiten.
  • Aktivitäts-/Fragmentlecks anzeigen: Zeigt Klassen an, die Speicherlecks verursachen.
  • Projektklassen anzeigen: Zeigt nur die durch Ihr Projekt definierten Klassen an.

Klicken Sie auf einen Klassennamen, um den Bereich Instanz zu öffnen. Jede aufgeführte Instanz enthält Folgendes:

  • Tiefe: Die kürzeste Anzahl von Hops von einem GC-Stammknoten zur ausgewählten Instanz.
  • Native Größe: Größe dieser Instanz im nativen Arbeitsspeicher. Diese Spalte ist nur für Android 7.0 und höher sichtbar.
  • Flache Größe: Größe dieser Instanz in Java-Arbeitsspeicher.
  • Behaltene Größe: Größe des Arbeitsspeichers, den diese Instanz dominiert (gemäß dem Dominator-Baum).

Klicken Sie auf eine Instanz, um die Instanzdetails einschließlich der Felder aufzurufen. und Referenzen. Gängige Feld- und Referenztypen sind strukturierte Typen , Arrays , und primitiven Datentypen, in Java. Klicken Sie mit der rechten Maustaste auf ein Feld oder eine Referenz, um die zugehörige Instanz oder Zeile im Quellcode aufzurufen.

  • Felder: Zeigt alle Felder in dieser Instanz an.
  • Referenzen: Hier werden alle Verweise auf das Objekt angezeigt, das auf dem Tab Instanz markiert ist.

Speicherlecks finden

Um schnell nach Klassen zu filtern, die möglicherweise mit Speicherlecks in Verbindung stehen, öffnen Sie und wählen Sie Aktivitäts-/Fragmentlecks anzeigen aus. Android Studio zeigt Klassen an, die seiner Meinung nach auf Speicherlecks für Activity- und Fragment-Instanzen in Ihrer App hinweisen. Zu den Datentypen, die der Filter anzeigt, gehören:

  • Activity Instanz, die gelöscht wurde, auf die aber noch verwiesen wird
  • Fragment Instanzen ohne gültige FragmentManager, aber sind noch immer als Referenz zu verwenden.

Beachten Sie, dass der Filter in folgenden Fällen zu falsch positiven Ergebnissen führen kann: Situationen:

  • Fragment wurde erstellt, aber noch nicht verwendet.
  • Ein Fragment wird im Cache gespeichert, aber nicht als Teil eines FragmentTransaction

Wenn Sie manuell nach Speicherlecks suchen möchten, können Sie in den Klassen- und Instanzlisten nach Objekten mit einer großen Retained Size suchen. Suchen Sie nach Speicherlecks, zu verwenden:

  • Langlebige Verweise auf Activity, Context, View, Drawable und andere Objekte die einen Verweis auf den Activity- oder Context-Container enthalten könnte.
  • Nicht statische innere Klassen, z. B. eine Runnable, das ein Activity enthalten kann Instanz.
  • Caches, die Objekte länger als nötig enthalten.

Verwenden Sie die Tabs Felder und Referenzen, um potenzielle Speicherlecks zu finden. können Sie unter Instanzdetails zur entsprechenden Instanz oder Quellcodezeile wechseln.

Speicherlecks für Tests auslösen

Zur Analyse der Arbeitsspeichernutzung sollten Sie Ihren App-Code belasten und versuchen, Arbeitsspeicher zu erzwingen Lecks. Eine Möglichkeit, Speicherlecks in Ihrer App zu provozieren, besteht darin, sie eine Weile laufen zu lassen, bevor Sie den Heap prüfen. Lecks können bis zu den Zuweisungen sickern. im Heap. Je kleiner der Leck ist, desto länger müssen Sie die App ausführen, um ihn zu sehen.

Sie können ein Speicherleck auch auf eine der folgenden Arten auslösen:

  • Drehen Sie das Gerät mehrmals zwischen Hoch- und Querformat, während sich das Gerät in verschiedenen Aktivitätsstatus befindet. Wenn das Gerät gedreht wird, kann dies Activity durchsickern lassen, Context oder View-Objekt, da das System das Objekt Activity und ob deine App einen Verweis auf eines dieser Objekte enthält an anderer Stelle verwendet, kann das System sie nicht automatisch entsorgen.
  • Sie können in verschiedenen Aktivitätszuständen zwischen Ihrer App und einer anderen App wechseln. Sie können beispielsweise zum Startbildschirm und dann zu Ihrer App zurückkehren.

Heap-Dump-Aufzeichnung exportieren und importieren

Sie können eine Heap-Dump-Datei auf dem Tab Frühere Aufzeichnungen im Profiler exportieren und importieren. Android Studio speichert die Aufzeichnung als .hprof-Datei.

Alternativ können Sie ein anderes .hprof-Dateianalysetool wie Jhat müssen Sie die Datei .hprof vom Android-Format in das Java SE-Format konvertieren .hprof-Dateiformat. Verwenden Sie zum Konvertieren des Dateiformats das hprof-conv-Tool im Verzeichnis {android_sdk}/platform-tools/. Führen Sie den Befehl hprof-conv mit zwei Argumenten aus: dem ursprünglichen .hprof-Dateinamen und dem Speicherort, an dem die konvertierte .hprof-Datei mit dem neuen .hprof-Dateinamen gespeichert werden soll. Für Beispiel:

hprof-conv heap-original.hprof heap-converted.hprof