Speicherkiller

Die Android-Plattform geht davon aus, dass kostenloser Arbeitsspeicher verschwendeter Arbeitsspeicher ist. Android versucht, den gesamten verfügbaren Arbeitsspeicher zu nutzen. Das System behält Apps beispielsweise im Arbeitsspeicher, nachdem sie geschlossen wurden, damit der Nutzer schnell zu ihnen zurückkehren kann. Aus diesem Grund haben Android-Geräte oft nur sehr wenig kostenlosen Arbeitsspeicher (siehe Android-Arbeitsspeicherzuweisung).

Der Low-Memory-Killer-Daemon (LMKD) für Android überwacht den Speicherstatus eines laufenden Android-Systems und reagiert auf eine hohe Speicherauslastung, indem er die am wenigsten wichtigen Prozesse beendet, damit das System weiterhin akzeptabel funktioniert.

Um zu entscheiden, welcher Prozess beendet werden soll, verwendet der LMK-Daemon einen Out-of-Memory-Score namens oom_adj_score, um laufende Prozesse zu priorisieren. Prozesse mit einem hohen Wert werden zuerst beendet. Hintergrund-Apps werden zuerst beendet, Systemprozesse zuletzt. In der folgenden Tabelle sind die LMK-Bewertungskategorien von hoch bis niedrig aufgeführt. Elemente in der Kategorie mit der höchsten Punktzahl in Zeile 1 werden zuerst entfernt:

Android-Prozesse werden nach absteigender Punktzahl sortiert: Hintergrund-Apps, vorherige App, Home App, Dienste, wahrnehmbare Apps, App im Vordergrund, persistent, System und nativ.
Abbildung 1: Android-Prozesse mit hohen Werten oben und niedrigen Werten unten.

Tools für das Arbeitsspeichernutzungs-Profiling

Mit den folgenden Tools können Sie Speicherprobleme auf folgende Weise finden und diagnostizieren:

  • Sehen Sie sich an, wie Ihrer App im Zeitverlauf Speicher zugewiesen wird. Sie sehen ein Echtzeitdiagramm, in dem dargestellt wird, wie viel Arbeitsspeicher Ihre App verwendet, wie viele Java-Objekte zugewiesen wurden und wann die automatische Speicherbereinigung erfolgt.
  • Sie können automatische Speicherbereinigungsereignisse initiieren und einen Snapshot des Java-Heaps erstellen, während Ihre App ausgeführt wird.
  • Sie können die Speicherzuweisungen Ihrer App aufzeichnen, alle zugewiesenen Objekte untersuchen und den Stacktrace für jede Zuweisung ansehen.

Wenn Ihr Spiel auf einer nativen Engine ausgeführt wird, verwenden Sie HWAddress Sanitizer, um die native Arbeitsspeicherzuweisung zu debuggen.

Speicher-Profiler von Android Studio

Android Studio bietet den Speicher-Profiler als Komponente des Android Profiler. Damit können Sie Speicherlecks und Memory Churn erkennen, die zu Ruckeln, Einfrieren und sogar App-Abstürzen führen können. Der Profiler zeigt ein Echtzeitdiagramm der Arbeitsspeichernutzung Ihrer App und ermöglicht es Ihnen, einen Heap-Dump zu erfassen, die automatische Speicherbereinigung zu erzwingen und die Arbeitsspeicherzuweisung zu verfolgen.

Abbildung 2. Globale JNI-Referenzen im Speicher-Profiler von Android Studio ansehen.

Unity-Tools für das Arbeitsspeichernutzungs-Profiling

Wenn Sie Ihre Apps mit der Unity-Engine entwickeln, können Sie sich an der Anleitung zum Unity-Speicherprofiling orientieren. Unity bietet zwei Tools zur Analyse der Arbeitsspeichernutzung in Ihrer Anwendung in Unity.

Das erste ist das Speicher-Profiler-Modul, ein integrierter Profiler, der Ihnen grundlegende Informationen dazu liefert, wo Ihre Anwendung Arbeitsspeicher verwendet.

Das Speichermodul zeigt Speicherzuweisungen wie Textur- und Mesh-Speicher an.
Abbildung 3: Unity Profiler-Fenster mit ausgewähltem Memory-Modul

Das zweite Tool ist das Speicher-Profiler-Paket, ein Unity-Paket, das Sie Ihrem Projekt hinzufügen können. Das Paket fügt dem Unity-Editor ein zusätzliches Speicher-Profiler-Fenster hinzu. Mit dem Speicher-Profiler können Sie die Arbeitsspeichernutzung in Ihrer Anwendung noch detaillierter analysieren. Sie können Snapshots speichern und vergleichen, um Speicherlecks zu finden oder das Speicherlayout zu sehen, um Probleme mit der Speicherfragmentierung zu erkennen.

Abbildung 4: Arbeitsspeicher-Snapshot mit dem Speicher-Profiler-Fenster analysieren

Unreal Memory Insights

Apps, die mit der Unreal Engine erstellt wurden, können Unreal Memory Insights verwenden, um detaillierte Informationen zur Arbeitsspeicherzuweisung und ‑freigabe zu erhalten, einschließlich der LLM-Tags (Low Level Memory) und Callstacks, die mit Speicherblöcken verknüpft sind.

Das Memory Insights-Abfragesystem kann Live-Zuweisungen zu jedem beliebigen Zeitpunkt finden, Änderungen in der Arbeitsspeichernutzung erkennen, Speicherlecks lokalisieren und kurzfristige von langfristigen Zuweisungen unterscheiden.

Ab UE 5.4 unterstützt Memory Insights die Arbeitsspeicherverfolgung mit Callstacks für Android-Projekte.

Memory Insights-Tracker mit Hauptspeicherdiagramm, Anzahl der Live-Zuweisungen und Anzahl der Zuweisungs-/Freigabeereignisse.
Abbildung 5. Unreal – Memory Insights-Tracker.

Informationen zu geringem Arbeitsspeicher

Android bietet Callbacks und APIs, mit denen du den Speicherbedarf deines Spiels reduzieren und herausfinden kannst, warum vorherige Spielvorgänge beendet wurden.

Callbacks

Registrieren Sie sich nicht für die eingestellten trim-Callbacks. Unter Android gibt es keine APIs zum Erkennen von Ereignissen mit hohem nativen Arbeitsspeicherverbrauch, wenn das System an seine Arbeitsspeicherlimits stößt. Trim-Callbacks haben nicht dazu beigetragen, das Beenden von Apps aufgrund von wenig Arbeitsspeicher zu verhindern. Daher wurden alle Trim-Callbacks außer TRIM_MEMORY_UI_HIDDEN und TRIM_MEMORY_BACKGROUND in Android eingestellt.

Spielabbruch

Android versucht, den gesamten verfügbaren Arbeitsspeicher zum Zwischenspeichern von Apps und Spielen zu verwenden, damit sie schnell geladen werden können und die Nutzerfreundlichkeit verbessert wird. Wenn der Arbeitsspeicher jedoch knapp wird, beendet das System die speicherintensivsten Apps und Spiele, um Arbeitsspeicher für den normalen Gerätebetrieb freizugeben.

Informationen, Statistiken und Best Practices, die Ihnen helfen, den Arbeitsspeicherverbrauch Ihres Spiels zu optimieren:

  • ApplicationExitInfo verwenden: Diese API gibt den Grund dafür zurück, warum der vorherige Spielvorgang vom Android-System beendet wurde. Verwenden SieApplicationExitInfo, um zu prüfen, ob ein geringer Arbeitsspeicher die Ursache für das Beenden eines vorherigen Prozesslaufs war. Prüfen Sie, ob das Spiel aufgrund von zu wenig Arbeitsspeicher beendet wurde, damit es für dieses Gerät optimiert werden kann.
  • Gesamter physischer RAM: Um zu verhindern, dass Spiele im Vordergrund beendet werden, und um die Gerätefunktionen zu berücksichtigen, sollten Sie den gesamten physischen RAM pro Gerät im Blick behalten, um die Arbeitsspeichernutzung des Spiels entsprechend anzupassen. Wenn Sie verhindern möchten, dass Apps kurz nach dem Wechsel in den Hintergrund beendet werden (damit der Spieler Multitasking betreiben kann), verwenden Sie die trim-Callbacks (insbesondere TRIM_MEMORY_UI_HIDDEN), um die Arbeitsspeichernutzung Ihres Spiels zu reduzieren.

Zusätzliche Ressourcen