Bei der Android-Plattform geht es darum, dass kostenloser Arbeitsspeicher verschwendet wird. Dabei wird immer versucht, den gesamten verfügbaren Arbeitsspeicher zu verwenden. Beispielsweise speichert das System Apps 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. Die Speicherverwaltung ist von entscheidender Bedeutung, um den Arbeitsspeicher zwischen wichtigen Systemprozessen und vielen Nutzeranwendungen richtig zuzuordnen.
Auf dieser Seite wird erläutert, wie Android Arbeitsspeicher für das System und für Nutzeranwendungen zuweist. Außerdem wird erläutert, wie das Betriebssystem auf Speichermangel reagiert.
Arbeitsspeichertypen
Android-Geräte verfügen über drei verschiedene Arten von Arbeitsspeicher: RAM, ZRAM und Speicher. Beachten Sie, dass CPU und GPU auf denselben RAM zugreifen.
Abbildung 1: Arbeitsspeichertypen – RAM, ZRAM und Speicher
RAM ist der schnellste Speichertyp, hat aber in der Regel nur eine begrenzte Größe. High-End-Geräte haben in der Regel die größte Menge an RAM.
zRAM ist eine RAM-Partition, die für den Auslagerungsbereich verwendet wird. Alles wird beim Einfügen in den zRAM komprimiert und beim Kopieren aus dem zRAM dekomprimiert. Dieser Teil des RAM wächst oder verkleinert sich, wenn Seiten in den zRAM verschoben oder daraus entfernt werden. Die Gerätehersteller können die maximale Größe festlegen.
Der Speicher enthält alle nichtflüchtigen Daten wie das Dateisystem und den enthaltenen Objektcode für alle Anwendungen, Bibliotheken und die Plattform. Der Speicher hat viel mehr Kapazität als die anderen beiden Speichertypen. Unter Android wird der Speicher nicht wie bei anderen Linux-Implementierungen für den Auslagerungsbereich verwendet, da häufiges Schreiben den Speicher abnutzen und die Lebensdauer des Speichermediums verkürzen kann.
Arbeitsspeicherseiten
Der RAM ist in Seiten aufgeteilt. In der Regel hat jede Seite 4 KB Arbeitsspeicher.
Seiten gelten entweder als kostenlos oder genutzt. Kostenlose Seiten sind ungenutzter RAM. Verwendete Seiten sind RAM, den das System aktiv nutzt, und sind in die folgenden Kategorien unterteilt:
- Im Cache: Arbeitsspeicher, der von einer Datei im Speicher gesichert wird (z. B. Code oder Dateien, die dem Arbeitsspeicher zugeordnet sind). Es gibt zwei Arten von im Cache gespeicherten Arbeitsspeicher:
- Privat: Die Daten sind einem Prozess zugeordnet und werden nicht freigegeben.
- Bereinigen: Unveränderte Kopie einer Datei im Speicher, kann von
kswapd
gelöscht werden, um freien Speicherplatz zu erhöhen - Schmutzig: Geänderte Kopie der Datei im Speicher; kann von
kswapd
in ZRAM verschoben oder dort komprimiert werden, um den kostenlosen Arbeitsspeicher zu erhöhen
- Bereinigen: Unveränderte Kopie einer Datei im Speicher, kann von
- Freigegeben: Wird von mehreren Prozessen verwendet
- Bereinigen: Unveränderte Kopie der Datei im Speicher, kann von
kswapd
gelöscht werden, um freien Speicherplatz zu erhöhen - Dirty: Geänderte Kopie der Datei im Speicher; ermöglicht das Zurückschreiben von Änderungen in die Datei im Speicher, um den kostenlosen Arbeitsspeicher um
kswapd
zu erhöhen, oder explizit mitmsync()
odermunmap()
- Bereinigen: Unveränderte Kopie der Datei im Speicher, kann von
- Privat: Die Daten sind einem Prozess zugeordnet und werden nicht freigegeben.
- Anonym: Arbeitsspeicher, der nicht von einer Datei im Speicher gesichert wird (z. B. zugewiesen von
mmap()
bei gesetztem FlagMAP_ANONYMOUS
)- Schmutzig: Kann in ZRAM von
kswapd
verschoben/komprimiert werden, um den kostenlosen Arbeitsspeicher zu erhöhen
- Schmutzig: Kann in ZRAM von
Die Anteile der kostenlosen und der genutzten Seiten variieren im Laufe der Zeit, da das System den RAM aktiv verwaltet. Die in diesem Abschnitt vorgestellten Konzepte sind der Schlüssel zum Umgang mit Situationen mit wenig Arbeitsspeicher. Im nächsten Abschnitt dieses Dokuments werden diese genauer erläutert.
Geringe Arbeitsspeicherverwaltung
Android hat zwei Hauptmechanismen für den Umgang mit geringem Arbeitsspeicher: den Kernel-Swap-Daemon und den Killer mit niedrigem Arbeitsspeicher.
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 nur noch wenig freier Speicherplatz auf dem Gerät zur Verfügung steht. Der Linux-Kernel hält die Grenzwerte für den kostenlosen Arbeitsspeicher niedrig und hoch.
Wenn der kostenlose Arbeitsspeicher unter den unteren Grenzwert fällt, beginnt kswapd
, Arbeitsspeicher freizugeben. Sobald der kostenlose Arbeitsspeicher den hohen Schwellenwert erreicht hat, beendet kswapd
die Freigabe des Arbeitsspeichers.
kswapd
kann saubere Seiten zurückfordern, indem sie sie löschen, da sie im Speicher verfügbar sind und nicht geändert wurden. Wenn ein Prozess versucht, eine saubere Seite zu identifizieren, die gelöscht wurde, kopiert das System die Seite vom Speicher in den RAM. Dieser Vorgang wird als Nachfrageseitenung bezeichnet.
Abbildung 2: Seite bereinigen, durch Speicherplatz gesichert, gelöscht
kswapd
kann im Cache gespeicherte private schmutzige Seiten und anonyme schmutzige Seiten in einen ZRAM verschieben, wo sie komprimiert werden. Dadurch wird verfügbarer Arbeitsspeicher im RAM (kostenlose Seiten) freigegeben. Wenn ein Prozess versucht, eine schmutzige Seite im ZRAM zu berühren, wird die Seite dekomprimiert und zurück in den RAM verschoben. Wenn der mit einer komprimierten Seite verknüpfte Prozess beendet wird, wird die Seite aus dem zRAM gelöscht.
Wenn die Menge des kostenlosen Arbeitsspeichers unter einen bestimmten Grenzwert fällt, beginnt das System, Prozesse zu beenden.
Abbildung 3: Schmutzige Seite wurde in ZRAM verschoben und komprimiert
Killer mit wenig Arbeitsspeicher
In vielen Fällen kann kswapd
nicht genügend Arbeitsspeicher für das System freigeben. In diesem Fall verwendet das System onTrimMemory()
, um eine App darüber zu informieren, dass nur noch wenig Arbeitsspeicher verfügbar ist und die Zuweisungen reduziert werden sollten. Wenn dies nicht ausreicht, beendet der Kernel Prozesse, um Arbeitsspeicher freizugeben. Dazu wird der Low-Memory-Killer (LMK) verwendet.
Um zu entscheiden, welcher Prozess beendet werden soll, verwendet LMK den Wert oom_adj_score
für „Nicht genügend Arbeitsspeicher“, um die ausgeführten Prozesse zu priorisieren. Prozesse mit einem hohen Wert werden zuerst beendet. Hintergrundanwendungen werden zuerst gelöscht, Systemprozesse als Letztes. In der folgenden Tabelle sind die LMK-Bewertungskategorien von hoch nach niedrig aufgeführt. Elemente in der Kategorie mit der höchsten Bewertung in Zeile 1 werden zuerst gelöscht:
Abbildung 4: Android-Prozesse, mit Highscores oben und Tiefstwerten unten
Im Folgenden finden Sie Beschreibungen der verschiedenen Kategorien in der Tabelle oben:
Hintergrund-Apps: Apps, die bereits ausgeführt wurden und derzeit nicht aktiv sind LMK beendet zuerst die Hintergrundanwendungen, 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 (eine niedrigere Punktzahl) als die Hintergrund-Apps, da es wahrscheinlicher ist, dass der Nutzer zu ihr wechselt als eine der Apps im Hintergrund.
Home App: Das ist die Launcher-App. Wenn du sie beendest, verschwindet der Hintergrund.
Dienste: Dienste werden von Anwendungen gestartet und können das Synchronisieren oder Hochladen in die Cloud umfassen.
Wahrnehmbare Apps: Apps, die nicht im Vordergrund stehen und für den Nutzer in irgendeiner Weise wahrnehmbar sind, z. B. ein Suchvorgang mit einer kleinen Benutzeroberfläche oder das Hören von Musik.
Vordergrund-App: Die aktuell verwendete App. Das Beenden der Vordergrund-App wirkt wie ein App-Absturz, was dem Nutzer signalisieren kann, dass ein Problem mit dem Gerät aufgetreten ist.
Persistent (Dienste): Dies sind Hauptdienste des Geräts, z. B. Telefonie und WLAN.
System: Systemprozesse. Wenn diese Prozesse abgebrochen werden, wird das Telefon möglicherweise 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.
Arbeitsspeicherbedarf berechnen
Der Kernel erfasst alle Arbeitsspeicherseiten im System.
Abbildung 5: Seiten, die von verschiedenen Prozessen verwendet werden
Bei der Bestimmung, wie viel Arbeitsspeicher von einer Anwendung verwendet wird, muss das System freigegebene Seiten berücksichtigen. Apps, die auf denselben Dienst oder dieselbe Bibliothek zugreifen, teilen Arbeitsspeicherseiten. Beispielsweise können Google Play-Dienste und eine Spiele-App einen Standortdienst gemeinsam nutzen. Dadurch lässt sich nur schwer feststellen, wie viel Arbeitsspeicher dem jeweiligen Dienst im Vergleich zu jeder Anwendung zur Verfügung steht.
Abbildung 6: Von zwei Apps geteilte Seiten (Mitte)
Um den Speicherbedarf für eine Anwendung zu ermitteln, können folgende Messwerte verwendet werden:
- Resident Set size (RSS): Die Anzahl der von der App verwendeten und nicht freigegebenen Seiten
- Proportional Set size (PSS): Die Anzahl der von der Anwendung verwendeten nicht freigegebenen Seiten und eine gleichmäßige Verteilung der freigegebenen Seiten. Wenn beispielsweise drei Prozesse sich 3 MB teilen, erhält jeder Prozess in PSS 1 MB.
- Unique Set Größe (USS): Die Anzahl der nicht freigegebenen Seiten, die von der App verwendet werden (freigegebene Seiten sind nicht inbegriffen)
PSS ist nützlich für das Betriebssystem, wenn es wissen möchte, wie viel Arbeitsspeicher von allen Prozessen belegt wird, da Seiten nicht mehrfach gezählt werden. Die Berechnung von PSS dauert lange, da das System bestimmen muss, welche Seiten von wie vielen Prozessen freigegeben werden. RSS unterscheidet nicht zwischen freigegebenen und nicht geteilten Seiten, was eine schnellere Berechnung ermöglicht, und eignet sich besser, um Änderungen bei der Arbeitsspeicherzuweisung nachzuverfolgen.
Weitere Informationen
- Übersicht über die Speicherverwaltung
- Prozesse und Anwendungslebenszyklus
- Informationen zur Android-Arbeitsspeichernutzung – Google I/O-Präsentation
- Android Memory and Games – Google I/O-Präsentation
- Android-Daemon mit geringem Arbeitsspeicher
Empfehlungen für dich
- Hinweis: Der Linktext wird angezeigt, wenn JavaScript deaktiviert ist.
- App-Startzeit