J'ai passé 4 jours entiers à essayer tout ce que je pouvais pour trouver la fuite de mémoire dans une application que je développais, mais les choses ont cessé de faire sens il y a longtemps.
L'application que je développe est de nature sociale, alors pensez au profil Activités (P) et répertoriez les activités avec des données - par exemple des badges (B). Vous pouvez passer d'un profil à une liste de badges, à d'autres profils, à d'autres listes, etc.
Alors imaginez un flux comme celui-ci P1 -> B1 -> P2 -> B2 -> P3 -> B3, etc. Par souci de cohérence, je charge les profils et les badges du même utilisateur, donc chaque page P est la même et donc chaque page B.
L'essentiel du problème est le suivant: après avoir navigué un peu, en fonction de la taille de chaque page, j'obtiens une exception de mémoire insuffisante à des endroits aléatoires - Bitmaps, Strings, etc. - cela ne semble pas cohérent.
Après avoir fait tout ce qui est imaginable pour comprendre pourquoi je manque de mémoire, je n'ai rien trouvé. Ce que je ne comprends pas, c'est pourquoi Android ne tue pas P1, B1, etc. s'il manque de mémoire lors du chargement et se bloque à la place. Je m'attendrais à ce que ces activités antérieures meurent et soient ressuscitées si jamais je reviens à elles via onCreate () et onRestoreInstanceState ().
Sans parler de cela - même si je fais P1 -> B1 -> Back -> B1 -> Back -> B1, je reçois toujours un crash. Cela indique une sorte de fuite de mémoire, mais même après avoir vidé hprof et utilisé MAT et JProfiler, je ne peux pas le localiser.
J'ai désactivé le chargement des images à partir du Web (et augmenté les données de test chargées pour compenser et rendre le test équitable) et me suis assuré que le cache d'images utilise SoftReferences. Android essaie en fait de libérer les quelques SoftReferences dont il dispose, mais juste avant de perdre la mémoire.
Les pages de badges obtiennent des données du Web, les chargent dans un tableau d'EntityData à partir d'un BaseAdapter et les alimentent dans un ListView (j'utilise en fait l' excellent MergeAdapter de CommonsWare , mais dans cette activité de Badge, il n'y a vraiment qu'un seul adaptateur de toute façon, mais je voulait mentionner ce fait de toute façon).
J'ai parcouru le code et je n'ai rien trouvé qui fuirait. J'ai effacé et annulé tout ce que je pouvais trouver et même System.gc () à gauche et à droite, mais l'application se bloque toujours.
Je ne comprends toujours pas pourquoi les activités inactives qui sont sur la pile ne sont pas récoltées, et j'aimerais vraiment comprendre cela.
À ce stade, je cherche des indices, des conseils, des solutions ... tout ce qui pourrait aider.
Je vous remercie.
outOfMemory
erreur. Merci!