Android-Speicher verstehen und Fehler beheben

Der Arbeitsspeicher ist eine wichtige und endliche Ressource auf Android-Geräten. Als Android-Plattformentwickler oder OEM ist es wichtig, zu verstehen, wie der Arbeitsspeicher auf allen Ebenen funktioniert – von der Java-Laufzeit bis zum Linux-Kernel –, um ein leistungsstarkes und stabiles System zu entwickeln.

Dieser Leitfaden bietet einen umfassenden Überblick über die Android-Speicherarchitektur, die für die Analyse verfügbaren Tools und praktische Übungen, mit denen Sie speicherbezogene Probleme identifizieren und beheben können.

Ziele

Nach Abschluss dieses Leitfadens können Sie:

  • Die grundlegenden Konzepte des Android-Arbeitsspeichers erklären, einschließlich des Zygote-Prozessmodells und der speicherzugeordneten Dateien.
  • Unterscheiden Sie zwischen Resident Set Size (RSS), Proportional Set Size (PSS) und Unique Set Size (USS).
  • Verwenden Sie Standard-Befehlszeilentools wie dumpsys meminfo und showmap, um die Speichernutzung schnell zu ermitteln.
  • Java-Heap-Dumps mit AHAT erfassen und analysieren, um Lecks und übermäßige Zuweisungen zu finden.
  • Verwenden Sie Perfetto und heapprofd, um sowohl den Java- als auch den nativen Arbeitsspeicher im gesamten System zu profilieren.
  • Systemweite Indikatoren für die Arbeitsspeicherauslastung wie Pressure Stall Information (PSI) verstehen und die Aktivität des Low Memory Killers (LMK) überwachen.
  • Beobachten Sie die Freigabeaktivität auf Kernelebene, einschließlich ZRAM-Swap und Entfernung des Seitencaches.

Inhaltsverzeichnis

Dieser Leitfaden ist in die folgenden Abschnitte unterteilt, die nacheinander gelesen werden sollten:

  1. Grundlegende Konzepte: Die wichtigsten technischen Prinzipien des Android-Arbeitsspeichers.
  2. Tools für die schnelle Bewertung: meminfo, showmap und procstats für die schnelle Triage.
  3. Java-Speicher analysieren: Detaillierte Informationen zum Java-Heap mit AHAT.
  4. Bitmaps und Arbeitsspeicher: Hier erfahren Sie, wie sich Bilder auf den RAM auswirken und wie Sie Tools zur Profilerstellung verwenden.
  5. Nativen Arbeitsspeicher analysieren: C/C++-Arbeitsspeicher mit Perfetto und heapprofd profilieren.
  6. WebView und Arbeitsspeicher: Informationen zur Multiprozessarchitektur und zum Speicherbedarf von WebViews.
  7. App-Code ist Arbeitsspeicher: Hier erfahren Sie, wie sich das Laden von Klassen und die Dex-Bloat auf den RAM auswirken.
  8. Threads und Arbeitsspeicher: Kosten nativer Thread-Stacks analysieren.
  9. Speicherlokalität und Leistung: Verstehen, wie sich Datenzugriffsmuster auf die CPU-Leistung auswirken.
  10. Dienstbindungen und Prozessstatus: Informationen dazu, wie sich prozessübergreifende Abhängigkeiten auf OOM-Werte auswirken.
  11. Systemweite Fehlerbehebung: Überwachung von PSI, LMK, ZRAM-Swap und Page-Cache-Entfernung.
  12. Speicherfreigabe: Entfernung und Auslagerung: Informationen zu memcg, Charge und proaktiver Freigabe mit memory.reclaim.
  13. Interaktion zwischen kswapd und lmkd: Informationen dazu, wie kswapd und lmkd unter Druck zusammenarbeiten.
  14. Speicherseiten an das Betriebssystem zurückgeben: Mit madvise und posix_fadvise werden nicht verwendete Heap-Seiten und Datei-Cache-Seiten an den Kernel zurückgegeben.
  15. Hintergrundarbeit mit einem schlanken Prozess aufrechterhalten: Hintergrunddienste und Worker in einen dedizierten Prozess verschieben, damit die Benutzeroberfläche und der Grafikspeicher nicht mit erhöhter Priorität gehalten werden.

Voraussetzungen und Umgebung

In diesem Leitfaden finden Sie Referenz-Workflows, Benchmark-Daten und Fallstudien, die zeigen, wie Sie Android-Speicherprobleme diagnostizieren und beheben können.

  • Analysetools: Für die Techniken in diesem Leitfaden werden hauptsächlich Standardtools für die Android-Leistung verwendet, darunter Perfetto, dumpsys meminfo, showmap und AHAT.
  • Root-Berechtigungen: Für einige Diagnoseworkflows auf Systemebene (z. B. die Prüfung der Kernel-Speicherauslastung oder der Hardware-PMU-Zähler) sind erhöhte Root-Berechtigungen (adb root) auf einem Userdebug-Gerät oder Emulator-Build erforderlich.

Hier beginnen: Grundlegende Konzepte