Aller au contenu

Fuite de mémoire ?


Guilo

Recommended Posts

Bonjour,

Je suis en train de créer un jeu qui consiste en une succession de tableaux sur lesquels le joueur doit trouver des objets. Chaque tableau est composé d'un dizaine d'image de faible résolution, de faible poids (qq ko) et d'une image de fond. Une fois le tableau terminé on passe au suivant, ce qui lance une nouvelle Activity. Je crée donc un Intent, il est démarré puis j'appelle finish() pour terminer l'Activity courante.

Le problème est qu'arrivé au 10e tableau, mon programme occupe plus de 30 Mo en mémoire., Je remarque que la mémoire augmente à l'ouverture de chaque nouvelle Activity.

Comment y remedier ?

Merci.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour, je vais chercher ça. Mais je n'utilise pas d'objet bitmap directement. Mon image de fond est le background du layout, mes autres images sont des ImageView obtenues par findViewByID et j'en manipule en suite les parametres de leurs layouts.

Merci

EDIT :

En fait pour être plus clair, ce n'est pas vraiment la quantité d'image dans chaque tableau qui pose problème mais bien la non récupération de toute la mémoire après la fin d'une activité. Pourtant finish() est appelé juste après le start() de l'intent. Cela n'est-il pas sensé exécuter le garbage collector ?

Lien vers le commentaire
Partager sur d’autres sites

J'ai essayé avec leur méthode (http://liber.us/tarotbot/fr/android/dreaming-of-electric-sheep-memory-management-in-android).

J'ai effectivement une consommation de mémoire bien inférieure mais sur certaines images j'ai : "06-03 20:34:09.710: ERROR/AndroidRuntime(14450): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@4050ae30"

Alors qu'il ne s'agit plus de la même activité. Donc rien n'a encore été recyclé dans cette activité.

Lien vers le commentaire
Partager sur d’autres sites

Quand on recycle un Bitmap, d'après la doc, elle devient inutilisable. Cela parait logique. Mais est-ce que cela signifie que cette image que l'on vient de recycler ne peut plus être utilisée, même réinstanciée, dans une autre activité, à partir d'un layout différent ?

Merci

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

je suis interressé par ton problème car je viens recement d'y être confronté.

Lorsque je lance mon application, j'ai fait une jolie petite animation et je me suis retrouvé bloqué par une "Out Of Memory exception " au lancement de mon activité principale.

Pourtant, je change bien d'activité mais la mémoire elle reste consomée.

la seule solution que j'ai trouvé c'est de réduire la taille de mes images.

j'ai essayé plusieurs choses sans succès:

* Recycler au maximum les images

( mon animation était faite avec des background directement intégréer dans mon dossier drawable de l'application, donc pour recycler tout ça j'ai modifier mon code pour récupérer des images depuis la cartes sd et les mettre en background par la suite)

* forcer le Garbage Collector

* lancer une activité vide entre mes deux activité

( pourquoi pas, en supposant que le temps entre les activité suffirait a libérer la mémoire)

J'ai l'impression que la solution de déréférencement a des chances de fonctionner, mais je ne comprend pas comment l'intégrer a mon code.

Pour finir, comme tu le dis, il se pourrais que cette mauvaise gestion soit un bug d'android. et donc la... gros soucis.

Fait moi signe si tu arrives à quelque chose.

Lien vers le commentaire
Partager sur d’autres sites

  • 2 weeks later...

Je suis aussi confronté a ce problème.

J'ai lu sur le net qu'il faillais recyclé ses bitmap et les mettre a null pour forcé le gc (bizarrement la méthode recycle() ne fait pas grand chose...).

this._image.recycle();
this._image = null;

C'est effectivement un bug d'android...

Lien vers le commentaire
Partager sur d’autres sites

...(bizarrement la méthode recycle() ne fait pas grand chose...).

Je ne suis pas entièrement d'accord.

Dans mon cas, la méthode Recycle m'a aidé à corriger les premiers bug ( lorsque je commençais à avoir des dépassements mémoire)

J'ai lu quelque part que le recycle() effectue un GC.

Par contre, cela ne règle effectivement pas totalement le problème. Si quelqu'un à plus d'informations concernant ce problème ....

(pour information, j'ai repousser le problème en réduisant la taille mémoire de mes images en .png grace à photoshop:

en passant en couleur indexé, on ne perd pas grand chose en qualité d'affichage mais par contre on gagne 70% d'espace mémoire ! :emo_im_money_mouth: )

@ pluche

@ Pat: une idée pour dé-référencer tes images ?

Lien vers le commentaire
Partager sur d’autres sites

a part étudier le code ligne par ligne pas vraiment.

Parfois on réalise pas à quel point on trimballe des objets référencé d'une classe vers une autre.

sinon ya toujours l'utilisation du Traceview si tu as le temps:

http://android-developers.blogspot.com/2010/10/traceview-war-story.html

C'est du lourd et ca peut aider à comprendre ce qui se passe

J'ai eu moi aussi des pbs de memory leak avec mon app. J'ai fini par les résoudre en essayant de recoller le plus possible aux design pattern existants comme les viewHolders pour les listview etc.. puis en évitant de passer les activity dans les constructeurs des methodes a droite à gauche, se concentrer sur l'essentiel, revoir son archi, passer juste le context, etc..

Bon courage!

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...