Das Telefon (Jiayu G4S) läuft mit Android 4.4.2, 2 GB RAM, Stock Jiayu.es ROM (Kernel 3.4.67)
Die Bestandskonfiguration richtet auch einen Swap in zram ein, ich habe ihn deaktiviert, scheint keinen Unterschied zu machen.
Der Task-Manager zeigt jederzeit mindestens 0,92 GB frei oder mehr an. Es zeigt höchstens 12-13 zwischengespeicherte inaktive Apps, die sich noch im RAM befinden, etwas mehr, wenn das Prozesslimit manuell auf einen hohen Wert gesetzt wird (nur aus Spaß wähle ich 100).
Laut dumpsys meminfo
, sieht es jetzt so aus:
Total RAM: 2016644 kB
Free RAM: 883420 kB (230000 cached pss + 131652 cached + 521768 free)
Used RAM: 852001 kB (805401 used pss + 1684 buffers + 8972 shmem + 35944 slab)
Lost RAM: 281223 kB
ZRAM: 4 kB physical used for 0 kB in swap (0 kB total swap)
Tuning: 256 (large 512), oom 122880 kB, restore limit 40960 kB (high-end-gfx)
Und dennoch werden häufig verwendete Anwendungen regelmäßig aus dem Speicher geworfen (im Task-Manager mit 0.00b zugewiesen angezeigt), was zu einer kleinen Verzögerung beim nächsten Start führt.
oomkiller-Parameter scheinen vernünftig zu sein
shell@G4:/ $ cat /sys/module/lowmemorykiller/parameters/minfree
12288,15360,18432,21504,24576,30720
Warum werden häufig genutzte Programme rausgeschmissen, trotz all dem freien Speicher? Kann ich irgendetwas konfigurieren (ich habe Root-Zugriff)?
Und jetzt um mir selbst zu antworten. Wenn wir uns die Quellen von Android 4.4.2 (KOT39H) ansehen, haben wir in ProcessList.java eine maximale Anzahl von zwischengespeicherten Apps definiert, die auf einen beliebigen Wert von 24 festgelegt ist:
static final int MAX_CACHED_APPS = 24;
Dieser Wert wird von der computeEmptyProcessLimit-Funktion wie folgt weiter aufgeteilt: 2/3 gehen an das Limit für leere Prozesse und 1/3 gehen an das Limit für zwischengespeicherte Prozesse.
Jetzt haben wir also ein willkürliches Limit von 16 für leere und 8 für zwischengespeicherte Prozesse. (Aber kaufen Sie ein 3-GB-RAM-Telefon, um zu sehen, wie viel ungenutzter Speicher Sie haben werden.)
In Standard-Android ist die einzige Möglichkeit, dieses Limit zu ändern, zur Laufzeit über setProcessLimit(), was ein gerootetes Telefon, eine manuell in /system/priv-app installierte Anwendung und die erteilte SET_PROCESS_LIMIT-Berechtigung erfordert.
(In CM11 zum Beispiel kann es auch in build.prop gesetzt werden, aber dieser Code ist in Stock 4.4.2 nicht vorhanden)
Glücklicherweise gibt es auf github bereits eine solche Anwendung namens SetAndroidProcessLimit, die, korrekt installiert, funktioniert (mein Dank an den Autor)
Jetzt habe ich 20 zwischengespeicherte Apps im RAM, das sind ungefähr alle Apps, die ich häufig verwende, und jede von ihnen startet sofort und ohne Verzögerung.
Ich habe auch herausgefunden, wie man MAX_CACHED_APPS direkt in /system/framework/services.jar ändert