1 votes

Le téléphone expulse les applications inactives de la mémoire vive, alors qu'il y a beaucoup de mémoire libre

Le téléphone (Jiayu G4S) fonctionne sous Android 4.4.2, 2GB de ram, stock jiayu.es rom (kernel 3.4.67).

La configuration de base met également en place un échange dans zram, je l'ai désactivé, cela ne semble pas faire de différence.

Le gestionnaire de tâches affiche à tout moment au moins 0,92 Go de libre ou plus. Il montre au maximum 12-13 applications inactives en cache qui sont encore dans la mémoire vive, un peu plus si la limite de processus est réglée manuellement sur une valeur élevée (juste pour le plaisir, j'ai choisi 100).

Selon le dumpsys meminfo Voici ce qu'il en est aujourd'hui :

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)

Pourtant, les applications fréquemment utilisées sont périodiquement éjectées de la mémoire (dans le gestionnaire des tâches, 0,00b est alloué), ce qui entraîne un léger retard lors du lancement suivant.

Les paramètres de l'oomkiller semblent sains d'esprit

shell@G4:/ $ cat /sys/module/lowmemorykiller/parameters/minfree                
12288,15360,18432,21504,24576,30720

Pourquoi les programmes fréquemment utilisés sont-ils exclus, malgré toute la mémoire disponible ? Y a-t-il quelque chose que je puisse configurer (j'ai un accès root) ?

0voto

Dan Points 111

Et maintenant, je réponds à moi-même. En regardant les sources d'Android 4.4.2 (KOT39H), dans ProcessList.java nous avons défini un nombre maximum d'applications en cache, fixé à une valeur arbitraire de 24 :

static final int MAX_CACHED_APPS = 24;

Cette valeur est ensuite divisée comme suit par la fonction computeEmptyProcessLimit : 2/3 vont à la limite du processus vide et 1/3 à la limite du processus mis en cache.

Nous avons donc maintenant une limite arbitraire de 16 pour les processus vides et de 8 pour les processus mis en cache. (Mais allez acheter un téléphone avec 3GB de mémoire vive, pour voir combien de mémoire inutilisée vous aurez)

Dans le système Android standard, le seul moyen de modifier cette limite est de le faire au moment de l'exécution, via setProcessLimit(), ce qui nécessite un téléphone rooté, une application installée manuellement dans /system/priv-app et l'autorisation SET_PROCESS_LIMIT.

(Dans CM11 par exemple, il peut également être défini dans build.prop, mais ce code n'est pas présent dans la version 4.4.2).

Heureusement, il existe déjà une telle application sur github, appelée SetAndroidProcessLimit, qui, installée correctement, fonctionne (mes remerciements à l'auteur).

Maintenant, j'ai 20 applications en cache dans la mémoire vive, c'est-à-dire à peu près toutes les applications que j'utilise fréquemment, et n'importe laquelle d'entre elles démarre instantanément, sans aucun délai.


J'ai également trouvé comment modifier MAX_CACHED_APPS directement dans /system/framework/services.jar.

  • téléchargez le jar sur votre PC, décompressez le jar
  • décompiler classes.dex avec baksmali (ou via apktool)
  • modifier dans ProcessList.smali et dans ActivityManagerService.smali - parce qu'il s'agit de bytecode, vous devez remplacer non seulement la déclaration de MAX_CACHED_APPS mais aussi toutes les occurrences de cette valeur par la nouvelle valeur souhaitée.
  • recompiler classes.dex
  • reconditionner le pot
  • télécharger sur le téléphone, en remplaçant le jar original (vous devez remonter rw /system)
  • redémarrer le téléphone ; le mien régénère automatiquement le cache dalvik

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X