Arbeitsspeichernutzung (anonymer RSS + Auslagerung)

Die Arbeitsspeichernutzung (anonymer RSS + Auslagerung) ist ein Messwert in Android Vitals, der die Arbeitsspeichernutzung Ihrer App widerspiegelt.

Anonymer Arbeitsspeicher ist Arbeitsspeicher, der nicht durch eine Datei im Speicher gesichert wird, z. B. Heap-Zuweisungen und mmap-zugewiesener Arbeitsspeicher. Dabei werden die dynamischen Speicherzuweisungen Ihrer App erfasst, einschließlich des Java- oder Kotlin-Heaps, nicht verwalteter nativer Heap-Zuweisungen (wo sich Bitmap-Pixeldaten unter Android 8.0 (API-Level 26) und höher befinden) und Thread-Ausführungsstacks. Das Betriebssystem kann zwar dateigestützten Arbeitsspeicher bei Bedarf freigeben, aber keinen anonymen Arbeitsspeicher.

Die Resident Set Size (RSS) ist die Gesamtzahl der von einem Prozess verwendeten Speicherseiten (sowohl gemeinsam genutzte als auch nicht gemeinsam genutzte), die sich im physischen RAM befinden. Eine Seite gilt als „freigegeben“, wenn sie von mehr als einem Prozess aufgerufen wird, z. B. von Apps, die auf dieselbe Bibliothek zugreifen.

Bei anonymem Speicher kann das System Seiten in den Auslagerungsspeicher (oder zRAM unter Android) schreiben, wenn der Speicher ausgelastet ist. Das System kann diese Seiten bei Bedarf aus dem Swap-Speicher lesen.

Die Arbeitsspeichernutzung (anonymer RSS + Auslagerung) ist ein Maß für die Gesamtzahl der Arbeitsspeicherseiten Ihrer App, die nicht durch eine Datei im Speicher gesichert werden, einschließlich des Arbeitsspeichers, der auch vom System im Auslagerungsspeicher gesichert wird. Durch das Erfassen anonymer RSS-Daten und das Auslagern von Arbeitsspeicher wird der tatsächliche, nicht auslagerbare Speicherbedarf Ihrer App ermittelt.

Wenn die Arbeitsspeichernutzung Ihrer App hoch ist, sollten Sie das Problem mithilfe der Anleitung auf dieser Seite genauer untersuchen und beheben.

Hohe Speichernutzung ermitteln

Android Vitals

In Android Vitals wird die Arbeitsspeichernutzung Ihrer App nach den folgenden Prozessstatus aufgeschlüsselt:

  • Vordergrund: Der Prozess der App ist sichtbar. Ein hoher P99-Wert wirkt sich häufig auf die von Nutzern wahrgenommene Leistung aus (Ruckeln oder OOM-Abstürze) und wird hauptsächlich durch das Beibehalten von UI-Komponenten oder Aktivitäten verursacht, die nicht mehr benötigt werden.
  • Wahrnehmbarer Dienst: Der Prozess der App wird in einem wahrnehmbaren Zustand ausgeführt. Dazu gehören Vordergrunddienste, beschleunigte Jobs und vom Nutzer initiierte Datenübertragungsvorgänge. Das kann sich auch auf systemgebundene Dienste oder Dienste erstrecken, die an andere Apps gebunden sind. Da diese Dienste für lang andauernde Aufgaben konzipiert sind, kann es sein, dass der P99-Tail im Laufe der Zeit ansteigt, wenn Arbeitsspeicher aufgrund von Lecks nicht freigegeben wird.
  • Hintergrund: Die App führt einen Hintergrunddienst aus oder wurde vor Kurzem in den Hintergrund verschoben, ist aber noch nicht im Cache. Hier können sich Hintergrundverarbeitungslecks und nicht freigegebene Ressourcen summieren. Da dieser Prozessstatus weniger wichtig ist als Vordergrund- oder wahrnehmbare Prozesse, sollten Sie versuchen, in diesem Status nicht zu viel Arbeitsspeicher zu belegen.
  • Im Cache: Die App befindet sich im Cache. Dieser Status reagiert sehr empfindlich auf eine hohe Arbeitsspeicherauslastung des Systems, z. B. durch LMKs. Da das Betriebssystem diesen Prozessstatus jederzeit entfernen kann, wird er nur zu Debugging-Zwecken bereitgestellt.

Informationen dazu, wie diese Prozessstatus mit onTrimMemory-Callbacks zusammenhängen, finden Sie im Leitfaden zum Freigeben von Arbeitsspeicher als Reaktion auf Ereignisse.

Android Vitals unterteilt die Arbeitsspeichernutzung Ihrer App auch nach RAM-Buckets. Der Messwert zur Arbeitsspeichernutzung wird als Zeitachse mit täglichen Perzentilwerten zusammen mit dem letzten Tageswert für das 50. und 90. Perzentil angezeigt.

Sobald Sie die Speichergrundlage ermittelt haben, folgen Sie der Anleitung zum Diagnostizieren und Verbessern einer übermäßigen Arbeitsspeichernutzung.

Speicherlecks mithilfe von Tail-Skew identifizieren

Um Speicherlecks zu erkennen, sollten Sie in Android Vitals nach einer Abweichung zwischen Ihren typischen (P50) und den Nutzern am unteren Ende (P90) suchen. Während sich die allgemeine Asset-Aufblähung gleichmäßig auf alle Perzentile auswirkt, verstärken sich Speicherlecks im Laufe der Zeit und verzerren die Daten am unteren Ende stark.

Vergleichen Sie Ihre P90- und P99-Messwerte mit Ihrer P50-Referenz nach Prozessname. Wenn das Verhältnis von P90 zu P50 mehr als 3,5-mal so hoch ist, deutet dies auf ein wahrscheinliches Speicherleck bei längeren Sitzungen hin. In bestimmten Anwendungsfällen deutet ein erhöhtes Verhältnis nicht immer auf ein Leck hin. Sie sollten den jeweiligen Workflow jedoch prüfen, um festzustellen, ob die erhöhte Arbeitsspeichernutzung erwartet wird.

Ressourcen

Übermäßige Arbeitsspeichernutzung lokal diagnostizieren

Um mit der Diagnose der Ursache für die übermäßige Arbeitsspeichernutzung zu beginnen, können Sie einen Heap-Dump mit Heap-Dump aufzeichnen in den Entwicklereinstellungen, Android Studio oder Perfetto erfassen. Wir empfehlen, zuerst einen Heap-Dump lokal zu erfassen, nachdem Sie die wichtigsten Aspekte des Nutzerverhaltens Ihrer App getestet haben.

Wir empfehlen insbesondere, die folgenden Nutzeraktionen zu testen:

  • Webviews und In-App-Browsersitzungen
  • Unendliches Scrollen mit vielen Medien
  • Abläufe zum Erstellen und Bearbeiten von Assets

Um potenzielle Speicherlecks zu untersuchen, identifizieren Sie zuerst die Prozesse mit der höchsten Arbeitsspeichernutzung. Verwenden Sie dazu die Tabelle Prozessname im Android Vitals-Dashboard zur Arbeitsspeichernutzung. Führen Sie als Nächstes die entsprechenden Nutzeraktionen lokal aus und erfassen Sie Heap-Dumps in verschiedenen Prozessstatus (sichtbar, Dienst im Vordergrund und im Cache), um zu prüfen, ob die App Arbeitsspeicher freigibt, nachdem sie in den Hintergrund verschoben wurde.

Wenn Sie Speicherprobleme mit dem Android Studio Profiler beheben, können Sie auch die LeakCanary-Integration verwenden, um die Erkennung von Speicherlecks und doppelten Bitmaps zu optimieren und so die Bildnutzung zu optimieren.

Nachdem Sie den Heap-Dump erfasst haben, empfehlen wir, ihn mit den Perfetto KI-Skills zu analysieren und potenzielle Quellen für eine hohe Arbeitsspeichernutzung zu ermitteln.

Hier ein Beispiel für eine Antwort der KI-Skills:

I have completed the analysis of memory leaks and bitmap issues for [app] using the provided Perfetto trace.
  Summary of Findings
  The investigation identified a critical memory pressure issue caused by massive bitmap retention within the app process.
...
Recommendations for [app]
   1. [Library] Image Cache Optimization:
       * Review the [Library] caching strategy. Ensure that bitmaps
         loaded for animations are released or downsampled when the animation is
         not in the foreground.
   2. Asset Resolution Audit:
       * The 14.7 MB average size suggests full-screen or extremely high-density assets. Audit the [library] files in the native_home component to ensure they are not using unnecessarily large source images.
   3. View Lifecycle Management:
       * Investigate why 21 [LibraryImage] instances are alive simultaneously. Ensure that views in the bottom
      tab are properly detached or their animations are cleared when switching between tabs.
   4. Fix Surface Leaks:
       * Address the Surface.release failures observed in the logs, as these can lead to both memory leaks and
         native resource exhaustion.

Zusätzliche Ressourcen zum Interpretieren von Heap-Dumps

In den folgenden Ressourcen finden Sie weitere Informationen zum Interpretieren von Heap-Dumps und zur Fehlerbehebung bei der Arbeitsspeichernutzung:

  • Manuelle Analyse:In der Anleitung zum Perfetto Heap Dump Explorer erfahren Sie, wie Sie Heap-Dump-Visualisierungen in der Perfetto-Benutzeroberfläche aufrufen und interpretieren.
  • Java-/Kotlin-Zuweisungen:Eine Schritt-für-Schritt-Anleitung zur Analyse von Heap-Dumps der Android Runtime (ART) finden Sie unter Ersten ART-Heap-Dump visualisieren.
  • Native Zuweisungen:In der Dokumentation zu Perfetto Native Profiling erfahren Sie, wie Sie native (C/C++) Speicherprofile erfassen und analysieren.
  • CLI-Prüfung:Mit adb dumpsys meminfo erhalten Sie eine schnelle Aufschlüsselung der Arbeitsspeichernutzung Ihrer App auf einem Gerät.
  • KI-basierte Analyse:Nutzen Sie Perfetto AI Skills, um LLM-basierte Analysen auszuführen, mit denen Sie Speicherlecks und übermäßige Zuweisungen in Ihren Traces erkennen können.
  • SQL-basierte Analyse:Verwenden Sie Perfetto SQL und Trace Analysis Skills, um strukturierte Abfragen und spezielle Skripts auszuführen, um komplexe Tracedaten zu analysieren.

Arbeitsspeichernutzung verbessern

In den folgenden Abschnitten finden Sie weitere Informationen zur Verbesserung der Arbeitsspeichernutzung Ihrer App:

Eine ausführliche Anleitung zur Behebung von Speicherproblemen finden Sie im Leitfaden Verwaltung Ihres App-Speichers.