2

J'ai une application mobile qui souffre de ralentissement au fil du temps. Mon intuition, (En partie alimenté par this article,) est que cela est dû à la fragmentation de la mémoire ralentir l'application vers le bas, mais je ne suis pas sûr. Voilà un joli graphique de l'utilisation de la mémoire de l'application au fil du temps:À quoi ressemble la mémoire fragmentée?

fraggle rock http://kupio.com/image-dump/fragmented.png

Les 4 pics sur le graphique 4 sont des exécutions de la même tâche exacte sur l'application. Je commence la tâche, il alloue un tas de mémoire, il reste un peu (la ligne plate en haut) et ensuite j'arrête la tâche. À ce stade, il appelle System.gc(); et la mémoire est nettoyée.

Comme on peut le voir, chacune des 4 exécutions de la même tâche prend plus de temps à s'exécuter. Les points bas dans le graphique reviennent tous au même niveau, donc il ne semble pas y avoir de fuites de mémoire entre les exécutions de tâches. Ce que je veux savoir, c'est que la fragmentation de la mémoire est une explication possible ou devrais-je regarder ailleurs d'abord, en gardant à l'esprit que j'ai déjà fait beaucoup de recherche? Les points bas sur le graphique sont relativement bas donc mon hypothèse est que dans cet état la mémoire ne serait pas très fragmentée car il ne peut y avoir beaucoup de petits trous de mémoire pour causer des problèmes.

Je ne sais pas comment fonctionne l'allocateur de mémoire j2me, donc je ne sais vraiment pas. Quelqu'un peut-il conseiller? Est-ce que quelqu'un d'autre a eu des problèmes avec cela et reconnaît le profil de la mémoire de l'application?

+0

La VM Java normale compacte son tas dans le cadre de ses tâches de récupération de place (en supprimant toute fragmentation) - pas sûr de J2ME si ... – bdonlan

Répondre

1

Si vous avez un peu de temps, vous pouvez tester votre théorie en réutilisant la mémoire en utilisant des techniques du pool de mémoire: chaque exécution de la tâche utilise les 'mêmes' morceaux de mémoire en les récupérant de la piscine et en les retournant au moment de la sortie.

Si vous constatez toujours la dégradation des performances après cette enquête, ce n'est pas la fragmentation de la mémoire qui cause le problème. Faites-nous savoir vos résultats et nous pouvons vous aider à résoudre les problèmes plus loin.

0

La fragmentation de la mémoire le rendrait compte ... ce qui n'est pas clair est de savoir si l'utilisation de la mémoire par les applications provoque la pagination? cela ralentirait aussi les choses ... et pourrait causer les mêmes problèmes.

0

Si le problème est vraiment la fragmentation de la mémoire, il n'y a pas grand chose à faire à ce sujet. Mais avant d'abandonner le désespoir, essayez d'exécuter votre application avec un profileur d'exécution pour voir si elle passe beaucoup de temps à s'exécuter dans un endroit inattendu. Il est possible que le ralentissement soit dû à un problème dans vos algorithmes, et pas à la fragmentation de la mémoire. Comme les gens l'ont déjà dit, les éboueurs J2ME ne devraient pas souffrir de problèmes de fragmentation.

0

Pensez à examiner les statistiques de collecte des ordures. Vous devriez avoir beaucoup plus sur la dernière course que la première, si votre théorie est de tenir. Une autre idée pourrait être que quelque chose d'autre mange votre mémoire afin que votre application a moins.

En d'autres termes, le temps de profileur :)

0

Sur quel système d'exploitation utilisez-vous cette fonction? J'ai de l'expérience avec les appareils Windows CE5 (ou Windows Mobile). L'architecture de la mémoire de niveau du système d'exploitation de CE5 est assez cassée et échouera bientôt pour les applications gourmandes en mémoire. Votre graphique n'a pas d'échelle, mais chaque processus n'obtient que 32 Mo d'espace d'adressage sur CE5. La VM et les bibliothèques partagées prendront également leur juste part de cela, vous laissant avec très peu de gauche. Le seul moyen de contourner cela est de réutiliser la mémoire que vous avez allouée au lieu de la renvoyer au collecteur et de la réaffecter plus tard.C'est, bien sûr, beaucoup plus de programmation de bas niveau que ce que vous voudriez normalement faire en Java, mais sur cette plate-forme, vous pourriez ne pas avoir de chance.

Questions connexes