35 votes

Est-ce que Dalvik VM traite la mémoire RAM du système?

L'Android developer documentation, dans le cadre du Projet Svelte (devise: "jamais Vous essayez de montage Bugdroid dans des jeans skinny?!?"), a une page sur la Gestion de la Mémoire de Votre Application. Il contient:

Lorsque l'utilisateur accède à une autre application et votre INTERFACE utilisateur n'est plus visible, vous devez libérer les ressources qui sont utilisées par seulement votre INTERFACE utilisateur. En libérant de l'INTERFACE utilisateur de ressources à ce moment peut augmenter de manière significative la capacité du système pour les processus mis en cache, ce qui a un impact direct sur la qualité de l'expérience utilisateur.

et:

TRIM_MEMORY_RUNNING_LOW: Votre application est en cours d'exécution et non pas tuables, mais l'appareil est en cours d'exécution beaucoup plus faible sur la mémoire de sorte que vous devez libérer des ressources non utilisées pour améliorer les performances du système (qui impacte directement les performances de votre application).

et la comme.

Cependant, ces n'a de sens que si "la libération de ressources" serait effectivement affecter la mémoire vive du système en quelque sorte.

J'étais sous l'impression que le Dalvik VM s'est comporté comme la machine virtuelle Java (ou peut-être "a", si ils ont changé quand je n'étais pas à la recherche). Autant que je sache, la machine virtuelle Java alloue de la mémoire vive du système pour augmenter la taille du tas, mais ne les commercialise pas, une fois attribué, il reste une partie de la mémoire système pour aussi longtemps que le processus s'exécute.

Si le Dalvik VM se comporte de la même façon, alors je ne vois pas comment l'augmentation de la quantité de non alloué de la mémoire dans notre processus aurait aucun impact sur les performances globales du système. Maintenant, pour libérer de la mémoire pour notre processus est une bonne chose, et peut-être que cela permettrait de diminuer le risque de nous avoir besoin de plus de RAM dans le futur... mais ce n'est pas ce que la documentation implique. La documentation indique "la libération de l'INTERFACE utilisateur de ressources à ce moment peut augmenter de manière significative la capacité du système pour les processus mis en cache"; il ne dit pas "la libération de l'INTERFACE utilisateur de ressources à ce moment n'a pas d'impact immédiat, mais permettra de réduire votre application du système de la mémoire RAM de l'empreinte dans le futur".

Maintenant, si les instructions nous a dit de nous libérer de la mémoire allouée par le NDK, qui aurait du sens, comme cela se produit à l'extérieur de la Dalvik tas et aurait une incidence sur le système de mémoire vive. Mais la documentation ne permet pas de faire cette distinction.

Le Dalvik VM en fait la libération de RAM allouée vers le système, autre que par la terminaison du processus? Si oui, quand? Et, dans une moindre mesure, comment est-ce fait, considérant que le garbage collector est non-compactage et non de la copie?

Merci!

29voto

fadden Points 17450

Oui. L'idée de base est que, si il y a un 4K page avec rien, la page sera renvoyé dans le système.

La fonction qui fait cela dans la machine virtuelle est appelée trimHeaps(), dans dalvik/vm/alloc/HeapSource.cpp. Vous pouvez le voir à l'aide de mspace_trim(), qui utilise l'OS appels de détacher des morceaux qui ne sont plus nécessaires (voir malloc_trim() commentaires autour de la ligne 1203 dans la fonction malloc.c). Il parcourt alors le tas avec mspace_inspect_all(), ce qui remet en releasePagesInRange() pour chaque région. Le rappel des tests pour voir si elle a été adoptée à une région avec pas de dotations en elle, et si oui, tronque les limites de 4K alignement. Si le résultat n'est pas vide, nous savons que la région s'étend sur une ou plusieurs pages de 4ko, qui peut être retourné pour le système avec de l' madvise(MADV_DONTNEED).

trimHeaps() est appelé à partir de quelques endroits, notamment gcDaemonThread(), qui va initier la garniture de cinq secondes après un simultanées GC. Le chronomètre est remis si la concurrente de GC qui se passe avant un délai de cinq secondes, l'idée étant que si nous sommes GCing alors la VM s'occupe activement de l'allocation et de cette sorte de temps d'inactivité de rognage sera contre-productif.

Parce que le Dalvik GC ne pas faire de compactage, ce n'est pas aussi efficace qu'elle pourrait l'être. La Fragmentation a tendance à s'accumuler au fil du temps, de sorte que la situation peut s'aggraver, plus un processus de vie. L'app cadre de "recycler" à long terme des services pour alléger cette.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X