Die Android-Plattform geht davon aus, dass kostenloser Arbeitsspeicher verschwendeter Arbeitsspeicher ist. Sie versucht, den gesamten verfügbaren Arbeitsspeicher jederzeit zu nutzen. Das System behält Apps beispielsweise im Arbeitsspeicher, nachdem sie geschlossen wurden, damit der Nutzer schnell wieder zu ihnen wechseln kann. Aus diesem Grund haben Android-Geräte oft sehr wenig kostenlosen Arbeitsspeicher. Die Arbeitsspeicherverwaltung ist entscheidend, um Arbeitsspeicher richtig zwischen wichtigen Systemprozessen und vielen Nutzeranwendungen zuzuweisen.
Auf dieser Seite werden die Grundlagen der Arbeitsspeicherzuweisung in Android für das System und für Nutzeranwendungen erläutert. Außerdem wird erklärt, wie das Betriebssystem auf Situationen mit wenig Arbeitsspeicher reagiert.
Arbeitsspeichertypen
Android-Geräte enthalten drei verschiedene Arten von Arbeitsspeicher: RAM, zRAM und Speicher. Sowohl die CPU als auch die GPU greifen auf denselben RAM zu.
Abbildung 1 : Arbeitsspeichertypen – RAM, zRAM und Speicher
RAM ist der schnellste Arbeitsspeichertyp, aber seine Größe ist in der Regel begrenzt. High-End-Geräte haben in der Regel den größten RAM.
zRAM ist eine Partition des RAM, die für den Auslagerungsspeicher verwendet wird. Alles wird komprimiert, wenn es in zRAM platziert wird, und dann dekomprimiert, wenn es aus zRAM kopiert wird. Dieser Teil des RAM wird größer oder kleiner, wenn Seiten in zRAM verschoben oder daraus entfernt werden. Gerätehersteller können die maximale Größe festlegen.
Der Speicher enthält alle persistenten Daten wie das Dateisystem und den enthaltenen Objektcode für alle Apps, Bibliotheken und die Plattform. Der Speicher hat eine viel größere Kapazität als die anderen beiden Arbeitsspeichertypen. Unter Android wird der Speicher nicht für den Auslagerungsspeicher verwendet wie bei anderen Linux-Implementierungen, da häufiges Schreiben zu Verschleiß führen und die Lebensdauer des Speichermediums verkürzen kann.
Arbeitsspeicherseiten
RAM ist in Seiten unterteilt. In der Regel hat jede Seite eine Größe von 4 KB.
Seiten werden entweder als kostenlos oder verwendet betrachtet. Kostenlose Seiten sind nicht verwendeter RAM. Verwendete Seiten sind RAM, der vom System aktiv genutzt wird, und werden in die folgenden Kategorien unterteilt:
- Im Cache: Arbeitsspeicher, der durch eine Datei im Speicher gesichert ist (z. B. Code oder speicherabgebildete Dateien). Es gibt zwei Arten von Arbeitsspeicher im Cache:
- Privat: Gehört einem Prozess und wird nicht freigegeben
- Bereinigt: Unveränderte Kopie einer Datei im Speicher, kann von
kswapdgelöscht werden, um kostenlosen Arbeitsspeicher zu erhöhen - Geändert: Geänderte Kopie der Datei im Speicher; kann von
kswapdin zRAM verschoben oder komprimiert werden, um kostenlosen Arbeitsspeicher zu erhöhen
- Bereinigt: Unveränderte Kopie einer Datei im Speicher, kann von
- Freigegeben: Wird von mehreren Prozessen verwendet
- Bereinigt: Unveränderte Kopie der Datei im Speicher, kann von
kswapdgelöscht werden, um kostenlosen Arbeitsspeicher zu erhöhen - Geändert: Geänderte Kopie der Datei im Speicher; ermöglicht, dass Änderungen von
in die Datei im Speicher zurückgeschrieben werden, um kostenlosen Arbeitsspeicher zu erhöhen
kswapd, oder explizit mitmsync()odermunmap()
- Bereinigt: Unveränderte Kopie der Datei im Speicher, kann von
- Privat: Gehört einem Prozess und wird nicht freigegeben
- Anonym: Arbeitsspeicher, der nicht durch eine Datei im Speicher gesichert ist (z. B.
zugewiesen durch
mmap()mit demMAP_ANONYMOUSFlag gesetzt)- Geändert: Kann von
kswapdin zRAM verschoben/komprimiert werden, um kostenlosen Arbeitsspeicher zu erhöhen
- Geändert: Kann von
Die Anteile der kostenlosen und verwendeten Seiten variieren im Laufe der Zeit, da das System den RAM aktiv verwaltet. Die in diesem Abschnitt eingeführten Konzepte sind entscheidend für die Verwaltung von Situationen mit wenig Arbeitsspeicher. Im nächsten Abschnitt dieses Dokuments werden sie genauer erläutert.
Verwaltung bei wenig Arbeitsspeicher
Android hat zwei Hauptmechanismen, um mit Situationen mit wenig Arbeitsspeicher umzugehen: den Kernel-Swap-Daemon und den Low-Memory-Killer.
Kernel-Swap-Daemon
Der Kernel-Swap-Daemon (kswapd) ist Teil des Linux-Kernels und wandelt verwendeten Arbeitsspeicher in kostenlosen Arbeitsspeicher um. Der Daemon wird aktiv, wenn der kostenlose Arbeitsspeicher auf dem Gerät knapp wird. Der Linux-Kernel verwaltet Grenzwerte für wenig und viel kostenlosen Arbeitsspeicher.
Wenn der kostenlose Arbeitsspeicher unter den niedrigen Grenzwert fällt, beginnt kswapd, Arbeitsspeicher freizugeben. Sobald der kostenlose Arbeitsspeicher den hohen Grenzwert erreicht, beendet kswapd die Freigabe von Arbeitsspeicher.
kswapd kann bereinigte Seiten freigeben, indem er sie löscht, da sie durch den Speicher gesichert sind und nicht geändert wurden. Wenn ein Prozess versucht, auf eine gelöschte bereinigte Seite zuzugreifen, kopiert das System die Seite aus dem Speicher in den RAM. Dieser Vorgang wird als Demand Paging bezeichnet.
Abbildung 2 : Bereinigte Seite, durch Speicher gesichert, gelöscht
kswapd kann geänderte private Seiten im Cache und geänderte anonyme Seiten in zRAM verschieben, wo sie komprimiert werden. Dadurch wird verfügbarer Arbeitsspeicher im RAM freigegeben (kostenlose Seiten). Wenn ein Prozess versucht, auf eine geänderte Seite in zRAM zuzugreifen, wird die Seite dekomprimiert und wieder in den RAM verschoben. Wenn der Prozess, der einer komprimierten Seite zugeordnet ist, beendet wird, wird die Seite aus zRAM gelöscht.
Wenn der kostenlose Arbeitsspeicher unter einen bestimmten Grenzwert fällt, beginnt das System, Prozesse zu beenden.
Abbildung 3 : Geänderte Seite in zRAM verschoben und komprimiert
Low-Memory-Killer
Oft kann kswapd nicht genügend Arbeitsspeicher für das System freigeben. In diesem Fall benachrichtigt das
System eine App mit
onTrimMemory(), dass der Arbeitsspeicher knapp wird und sie ihre
Zuweisungen reduzieren sollte. Wenn das nicht ausreicht, beginnt der Kernel, Prozesse zu beenden, um Arbeitsspeicher freizugeben. Dazu verwendet er den Low-Memory-Killer (LMK).
Um zu entscheiden, welcher Prozess beendet werden soll, verwendet LMK einen Score für "Out of Memory" namens
oom_adj_score
um die laufenden Prozesse zu priorisieren. Prozesse mit einem hohen Score werden zuerst beendet. Hintergrund-Apps werden zuerst beendet, Systemprozesse zuletzt. In der folgenden Tabelle sind die LMK-Scoring-Kategorien von hoch nach niedrig aufgeführt. Elemente in der Kategorie mit dem höchsten Score in der ersten Zeile werden zuerst beendet:
Abbildung 4 : Android-Prozesse mit hohen Scores oben und niedrigen Scores unten
Hier sind Beschreibungen für die verschiedenen Kategorien in der obigen Tabelle:
Hintergrund-Apps: Apps, die zuvor ausgeführt wurden und derzeit nicht aktiv sind. LMK beendet zuerst Hintergrund-Apps, beginnend mit der App mit dem höchsten
oom_adj_score.Vorherige App: Die zuletzt verwendete Hintergrund-App. Die vorherige App hat eine höhere Priorität (einen niedrigeren Score) als die Hintergrund-Apps, da es wahrscheinlicher ist, dass der Nutzer zu ihr wechselt als zu einer der Hintergrund-Apps.
Home-App: Dies ist die Launcher-App. Wenn sie beendet wird, verschwindet der Hintergrund.
Dienste: Dienste werden von Anwendungen gestartet und können die Synchronisierung oder das Hochladen in die Cloud umfassen.
Wahrnehmbare Apps: Apps, die nicht im Vordergrund ausgeführt werden, aber für den Nutzer in irgendeiner Weise wahrnehmbar sind, z. B. durch einen Suchvorgang, bei dem eine kleine Benutzeroberfläche angezeigt wird, oder durch Musikwiedergabe.
App im Vordergrund: Die App, die gerade verwendet wird. Wenn die App im Vordergrund beendet wird, sieht das wie ein Absturz der Anwendung aus, was dem Nutzer signalisieren könnte, dass etwas mit dem Gerät nicht stimmt.
Persistent (Dienste): Dies sind Hauptdienste für das Gerät, z. B. Telefonie und WLAN.
System: Systemprozesse. Wenn diese Prozesse beendet werden, sieht es möglicherweise so aus, als würde das Smartphone neu gestartet.
Nativ: Prozesse auf sehr niedriger Ebene, die vom System verwendet werden (z. B.
kswapd).
Gerätehersteller können das Verhalten von LMK ändern.
Speicherbedarf berechnen
Der Kernel verfolgt alle Arbeitsspeicherseiten im System.
Abbildung 5 : Von verschiedenen Prozessen verwendete Seiten
Bei der Bestimmung, wie viel Arbeitsspeicher von einer App verwendet wird, muss das System freigegebene Seiten berücksichtigen. Apps, die auf denselben Dienst oder dieselbe Bibliothek zugreifen, teilen sich Arbeitsspeicherseiten. Beispielsweise können Google Play-Dienste und eine Spiele-App einen Standortdienst gemeinsam nutzen. Dadurch ist es schwierig zu bestimmen, wie viel Arbeitsspeicher dem Dienst insgesamt und wie viel jeder Anwendung gehört.
Abbildung 6 : Von zwei Apps freigegebene Seiten (Mitte)
Zur Bestimmung des Speicherbedarfs einer Anwendung können die folgenden Messwerte verwendet werden:
- Resident Set Size (RSS): Die Anzahl der von der App verwendeten freigegebenen und nicht freigegebenen Seiten
- Proportional Set Size (PSS): Die Anzahl der von der App verwendeten nicht freigegebenen Seiten und eine gleichmäßige Verteilung der freigegebenen Seiten (wenn sich beispielsweise drei Prozesse 3 MB teilen, erhält jeder Prozess 1 MB in PSS)
- Unique Set Size (USS): Die Anzahl der von der App verwendeten nicht freigegebenen Seiten (freigegebene Seiten sind nicht enthalten)
PSS ist für das Betriebssystem nützlich, wenn es wissen möchte, wie viel Arbeitsspeicher von allen Prozessen verwendet wird, da Seiten nicht mehrfach gezählt werden. Die Berechnung von PSS dauert lange, da das System ermitteln muss, welche Seiten freigegeben sind und von wie vielen Prozessen. RSS unterscheidet nicht zwischen freigegebenen und nicht freigegebenen Seiten (wodurch die Berechnung schneller ist) und eignet sich besser, um Änderungen bei der Arbeitsspeicherzuweisung zu verfolgen.
Zusätzliche Ressourcen
- Arbeitsspeicherverwaltung – Übersicht
- Prozesse und Anwendungslebenszyklus
- Understanding Android-Arbeitsspeichernutzung – Google I/O-Präsentation
- Android Memory and Games – Google I/O-Präsentation
- Android Low-Memory-Killer-Daemon
Empfehlungen für Sie
- Hinweis: Linktext wird angezeigt, wenn JavaScript deaktiviert ist
- App-Startzeit