Arbeitsspeichernutzung (anonymer RSS + Auslagerung)

Die Arbeitsspeichernutzung (anonyme 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 ist, z. B. Heap-Zuweisungen und mit mmap zugewiesener Arbeitsspeicher. Hier werden die dynamischen Arbeitsspeicherzuweisungen Ihrer App erfasst, einschließlich des Java- oder Kotlin-Heaps, nicht verwalteter nativer Heap-Zuweisungen (wobei Bitmap-Pixeldaten unter Android 8.0 (API-Level 26) und höher gespeichert werden) und Thread-Ausführungsstacks. Während das Betriebssystem dateigestützten Arbeitsspeicher bei Bedarf freigeben kann, ist dies bei anonymem Arbeitsspeicher nicht möglich.

Resident Set Size (RSS) ist die Gesamtzahl der Arbeitsspeicherseiten (gemeinsam genutzt und nicht gemeinsam genutzt), die von einem Prozess verwendet werden und sich im physischen RAM befinden. Eine Seite gilt als „gemeinsam genutzt“, wenn sie von mehr als einem Prozess aufgerufen wird (z. B. von Apps, die auf dieselbe Bibliothek zugreifen).

Bei anonymem Arbeitsspeicher kann das System Seiten in den Auslagerungsspeicher (oder zRAM unter Android) schreiben, wenn der Arbeitsspeicher knapp wird. Bei Bedarf kann das System diese Seiten aus dem Auslagerungsspeicher lesen.

Insgesamt ist die Arbeitsspeichernutzung (anonyme RSS + Auslagerung) ein Maß für die Gesamtzahl der Arbeitsspeicherseiten Ihrer App, die nicht durch eine Datei im Speicher gesichert sind, einschließlich des Arbeitsspeichers, der vom System im Auslagerungsspeicher gespeichert wird. Wenn Sie die anonyme RSS + Auslagerung im Blick behalten, sehen Sie den tatsächlichen, nicht freigebbaren Speicherbedarf Ihrer App.

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

Hohe Arbeitsspeichernutzung 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 oft auf die vom Nutzer wahrgenommene Leistung aus (Ruckeln oder OOM-Abstürze) und wird stark durch das Beibehalten von UI-Komponenten oder Aktivitäten verursacht, die nicht mehr benötigt werden.
  • Vom Nutzer wahrgenommene Dienste: Der Prozess der App wird in einem wahrnehmbaren Status ausgeführt. Dazu gehören Vordergrunddienste, beschleunigte Jobs und vom Nutzer initiierte Datenübertragungsjobs. Es kann sich auch auf systemgebundene Dienste oder Dienste erstrecken, die von anderen Apps gebunden werden. Da diese Dienste für lang andauernde Aufgaben konzipiert sind, kann das Beibehalten von Arbeitsspeicher aufgrund von Lecks oder das Versäumen, Ressourcen freizugeben, den P99-Wert im Laufe der Zeit erhöhen.
  • Hintergrund: Die App führt einen Hintergrunddienst aus oder wurde kürzlich in den Hintergrund verschoben, ist aber noch nicht im Cache. Hier können sich Lecks bei der Hintergrundverarbeitung und nicht freigegebene Ressourcen summieren. Da dieser Prozessstatus weniger wichtig ist als Vordergrund- oder wahrnehmbare Prozesse, sollten Sie vermeiden, in diesem Status große Mengen an Arbeitsspeicher zu belegen.
  • Im Cache: Die App befindet sich im Cache. Dieser Status ist sehr anfällig für Systemarbeitsspeicherprobleme wie LMKs. Da das Betriebssystem diesen Prozessstatus jederzeit freigeben kann, wird er nur zu Debugging-Zwecken bereitgestellt.

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

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

Nachdem Sie Ihre Arbeitsspeicher-Baseline ermittelt haben, folgen Sie der Anleitung, um eine übermäßige Arbeitsspeichernutzung zu diagnostizieren und zu verbessern.

Arbeitsspeicherlecks mithilfe der Verteilung am Ende der Verteilungskurve ermitteln

Um Arbeitsspeicherlecks zu ermitteln, suchen Sie in Android Vitals nach Abweichungen zwischen Ihren typischen (P50) und den Nutzern am Ende der Verteilungskurve (P90). Während eine allgemeine Asset-Überlastung den Arbeitsspeicher gleichmäßig über alle Perzentile hinweg erhöht, summieren sich Arbeitsspeicherlecks im Laufe der Zeit und verzerren die Daten am Ende der Verteilungskurve stark.

Vergleichen Sie Ihre P90- und P99-Messwerte nach Prozessname mit Ihrer P50-Baseline. Wenn das Verhältnis von P90 zu P50 das 3,5-Fache übersteigt, deutet dies auf ein wahrscheinliches Arbeitsspeicherleck bei längeren Sitzungen hin. In bestimmten Anwendungsfällen deutet ein erhöhtes Verhältnis nicht immer auf ein Leck hin. Sie sollten jedoch den spezifischen Workflow prüfen, um festzustellen, ob die erhöhte Arbeitsspeichernutzung ein erwartetes Verhalten ist.

Ressourcen

Übermäßige Arbeitsspeichernutzung lokal diagnostizieren

Um die Ursache für eine übermäßige Arbeitsspeichernutzung zu diagnostizieren, können Sie in den Entwickleroptionen, in Android Studio oder in Perfetto einen Heap-Dump mit Heap-Dump aufzeichnen erfassen. Wir empfehlen, zuerst einen Heap-Dump lokal zu erfassen, nachdem Sie die wichtigsten Nutzerpfade Ihrer App getestet haben.

Wir empfehlen insbesondere, die folgenden Nutzerpfade zu testen:

  • Webviews und In-App-Browsersitzungen
  • Medienlastiges unendliches Scrollen
  • Abläufe zum Erstellen und Bearbeiten von Assets

Um potenzielle Arbeitsspeicherlecks zu untersuchen, ermitteln Sie zuerst die Prozesse mit der höchsten Auslastung in der Tabelle Prozessname im Dashboard zur Arbeitsspeichernutzung von Android Vitals. Führen Sie dann die entsprechenden User Journeys 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 Arbeitsspeicherprobleme mit dem Android Studio Profiler debuggen, können Sie auch die LeakCanary-Integration verwenden, um die Erkennung von Lecks und doppelten Bitmaps zu optimieren und die Bildnutzung zu optimieren.

Nachdem Sie den Heap-Dump erfasst haben, empfehlen wir, die Perfetto AI Skills zu verwenden, um den Heap-Dump zu analysieren und potenzielle Ursachen für eine hohe Arbeitsspeichernutzung zu ermitteln.

Hier ein Beispiel für eine mögliche 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.

Weitere Ressourcen zum Interpretieren von Heap-Dumps

Die folgenden Ressourcen enthalten weitere Informationen zum Interpretieren von Heap-Dumps und zum Debuggen der Arbeitsspeichernutzung:

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

Arbeitsspeichernutzung verbessern

In diesen Abschnitten erfahren Sie mehr darüber, wie Sie die Arbeitsspeichernutzung Ihrer App verbessern können:

Eine detaillierte Anleitung zum Beheben von Arbeitsspeicherproblemen finden Sie im Leitfaden Arbeitsspeicher Ihrer App verwalten.