J'ai passé 4 jours à essayer tout ce que je peux comprendre la fuite de mémoire dans une application que je suis en développement, mais les choses cessé de faire sens, il y a longtemps.
L'application que je suis en développement est de nature sociale, alors pensez au profil des Activités de (P) et de la liste des Activités avec les données - par exemple des badges (B). Vous pouvez monter à partir du profil de l'insigne de la liste à d'autres profils, pour d'autres listes, etc.
Imaginez donc un flux comme cette P1 -> B1 -> P2 -> B2 -> P3 -> B3, etc. Pour des raisons de cohérence, je suis le chargement des profils et des insignes de la même utilisateur, de sorte que chaque P page est la même et est donc chaque B page.
L'essentiel du problème est le suivant: après avoir navigué un peu, en fonction de la taille de chaque page, j'obtiens un souvenir d'exception dans des endroits aléatoires - des Bitmaps, des Chaînes, etc -, il ne semble pas être compatible.
Après avoir fait tout ce qui est imaginable de comprendre pourquoi je suis à cours de mémoire, j'en suis venu avec rien. Ce que je ne comprends pas, c'est pourquoi Android n'est pas de tuer P1, B1, etc si elle est à court de mémoire lors du chargement et au lieu des collisions. Je m'attends à ce que ces activités antérieures à mourir et à ressusciter si jamais j'ai de nouveau à eux via onCreate() et onRestoreInstanceState().
Le laisser seul, même si je ne P1 -> B1 -> Retour -> B1 -> Retour -> B1, je reçois toujours un crash. Cela indique une sorte de fuite de mémoire, mais même après dumping hprof et l'utilisation de MAT et JProfiler, je ne peux pas identifier.
J'ai désactivé le chargement des images à partir du web (et augmenté les données d'essai chargé de se rattraper et de faire le test juste) et fait en sorte que l'image cache utilise SoftReferences. Android en fait essaie de libérer les quelques SoftReferences il a, mais juste avant qu'il se bloque de mémoire.
Insigne de pages d'obtenir les données à partir du web, de le charger dans un tableau de EntityData à partir d'un BaseAdapter et le donner à un ListView (je suis en fait en utilisant CommonsWare est excellent MergeAdapter, mais dans ce Badge, il est vraiment seulement 1 adaptateur de toute façon, mais je voulais parler de ce fait de toute façon).
Je suis passé par le code et n'a pas été en mesure de trouver quelque chose qui serait en fuite. J'ai effacé et entaché de nullité de tout ce que j'ai pu trouver et même Système.gc() à gauche et à droite, mais encore l'application se bloque.
Je ne comprends toujours pas pourquoi inactif activités qui sont sur la pile n'obtenez pas moissonnés, et j'aimerais vraiment comprendre.
À ce stade, je suis à la recherche des indices, des conseils, des solutions... tout ce qui pourrait les aider.
Je vous remercie.