[java] Pourquoi la mémoire de tas augmente-t-elle lors de la relance d'une activité?


Answers

Semble que vous avez une fuite de mémoire au sein de cette activité.

Probablement vous fuyez le contexte (l'activité dans ce cas). Assurez-vous que toutes les références au contexte sont nettoyées lorsque vous appelez la méthode onDestroy dans l'activité. Plus de détails ici .

Jetez aussi un coup d'œil aux éventuels observateurs du contenu qui ne sont pas désinscrits lorsque vous avez terminé l'activité.

Question

Cette question concerne la mémoire sous Android.

Ma méthode:

J'ai deux activités, A et B. A, je lance B comme ceci:

Intent i = new Intent(A.this, B.class);
startActivity(i);

Cliquez sur le bouton en B, je fais ceci:

B.this.finish();
  • Dans B, je remplacer la méthode onDestroy et définir toutes les références à null.
  • Je n'alloue pas de nouvelle mémoire dans la méthode onResume de A.
  • Je ne fuis pas un contexte.
  • Je n'utilise pas plusieurs threads.
  • Je n'utilise pas de services.
  • Toutes les variables dans B sont des variables de classe privées, et toutes sont définies sur null dans le onDestroy de B.
  • En outre, ImageViews dans B ont leur arrière-plan défini null dans le onDestroy de B.
  • Je suis certain que B est détruit.

Le résultat:

Quand je suis dans l'activité A, la mémoire de tas est à 7.44 MB. Puis quand je commence B et que j'appelle finish sur B (et retourne donc à A), le tas est augmenté de 0.16 MB. Répétant ce processus à nouveau, le tas est augmenté de 0,08 Mo à chaque fois.

  • Je ne regarde pas la limite du tas, je regarde le tas alloué.
  • J'appelle System.gc () à la fin de la méthode onDestroy de B.

Information additionnelle:

-J'ai utilisé MAT pour analyser les allocations de mémoire et essayer de trouver cette fuite. Quelque chose d'étrange est que l'activité B semble avoir 5 instances. Comme cela arrive, je répétais le processus startActivity / finish 5 fois. L'entrée du bas est l'activité, les autres sont les auditeurs de l'activité:

Et ceci est une capture d'écran de l'arbre dominateur. Je ne trouve rien d'inhabituel ou de suspect.

-J'ai regardé les deux vidéos google IO sur l'utilisation de la mémoire (et les fuites).

Question:

Est-il possible que ce 0,08 Mo de tas soit toujours alloué (et non perçu par le GC) quoi que je fasse? Si non, aucune idée de ce qui pourrait causer cela?

Mettre à jour:

  1. J'ai essayé de lancer l'activité B sans définir une vue de contenu dans B. Cela signifie que B est une activité complètement vide. Le résultat était que la mémoire de tas n'a pas augmenté quand je relance l'activité plusieurs fois. Notez, cependant, que ce n'est pas une solution. Je dois pouvoir définir une vue de contenu.

  2. scorpiodawg: J'ai essayé d'exécuter mon application sur un émulateur, et le tas continue de croître. Bon essayer cependant.

  3. ntc: J'ai changé toutes les occurrences de "this" en "getApplicationContext ()" là où c'était possible. Je ne pouvais pas appeler setContentView (getApplicationContext ()); parce que setContentView veut une référence à un fichier de mise en page, pas un contexte. Ce que j'ai fait à la place était de créer un fichier de mise en page vide et d'appeler setContentView (emptylayout); dans la méthode onDestroy de l'activité B. Cela n'a pas aidé.

  4. J'ai essayé de supprimer tout le code afin que seulement setContentView (mylayout) soit appelé. Le problème a persisté. Ensuite, j'ai supprimé tous les éléments gui dans le fichier XML de mise en page. Le problème a persisté. La seule chose qui restait était les vues conteneur, un couple de linéaire imbriqué, relatif et scrolllayouts. J'ai essayé de supprimer l'attribut "android: scrollbarDefaultDelayBeforeFade" dans la barre de défilement. Le résultat était génial, la fuite de mémoire avait disparu. Ensuite, j'ai remis tout le code que j'ai précédemment enlevé mais n'a pas mis l'attribut "android: scrollbarDefaultDelayBeforeFade" et la fuite de mémoire était de retour. Comme c'est étrange?




Penser à utiliser

android:launchMode="singleTask"

dans votre AndroidManifest.xml. Voir ça .




Links