J'ai développé une application Android, et je suis au stade du développement d'une application pour téléphone où tout semble bien fonctionner et où vous voulez déclarer la victoire et le navire, mais vous savez qu'il doit juste y avoir des fuites de mémoire et de ressources là-dedans; et il n'y a que 16 Mo de tas sur Android et il est apparemment étonnamment facile de fuir dans une application Android.
J'ai regardé autour de moi et jusqu'à présent, je n'ai pu trouver des informations que sur «hprof» et «traceview» et aucun des deux n'a reçu beaucoup de critiques favorables.
Quels outils ou méthodes avez-vous rencontrés ou développés et souhaitez-vous partager peut-être dans un projet OS?
android
memory-leaks
jottos
la source
la source
Réponses:
L'une des erreurs les plus courantes que j'ai trouvées lors du développement d'applications Android est l'erreur «java.lang.OutOfMemoryError: Bitmap Size Exceeds VM Budget». J'ai trouvé cette erreur fréquemment sur les activités utilisant beaucoup de bitmaps après avoir changé d'orientation: l'activité est détruite, créée à nouveau et les mises en page sont «gonflées» à partir du XML consommant la mémoire VM disponible pour les bitmaps.
Les bitmaps de la disposition d'activité précédente ne sont pas correctement désalloués par le garbage collector car ils ont croisé des références à leur activité. Après de nombreuses expériences, j'ai trouvé une assez bonne solution à ce problème.
Tout d'abord, définissez l'attribut "id" sur la vue parente de votre mise en page XML:
Ensuite, sur la méthode onDestroy () de votre activité, appelez la méthode unbindDrawables () en passant une référence à la vue parent puis effectuez un System.gc ()
Cette méthode unbindDrawables () explore l'arborescence des vues de manière récursive et:
la source
PageAdapter
et je me fais travailler par cette erreur :(Obtenez l'analyseur de mémoire Eclipse ( http://www.eclipse.org/mat/ ) Vérifiez http://kohlerm.blogspot.com/2010/02/android-memory-usage-analysis-slides.html et http: // kohlerm.blogspot.com/search/label/memory
la source
Principalement pour les voyageurs Google du futur:
La plupart des outils java ne sont malheureusement pas adaptés à cette tâche, car ils n'analysent que le JVM-Heap. Chaque application Android dispose également d'un tas natif, qui doit également tenir dans la limite d'environ 16 Mo. Il est généralement utilisé pour les données bitmap, par exemple. Ainsi, vous pouvez vous heurter assez facilement à des erreurs de mémoire insuffisante même si votre JVM-Heap est d'environ 3 Mo, si vous utilisez beaucoup de drawables.
la source
La réponse de @ hp.android fonctionne bien si vous ne travaillez qu'avec des arrière-plans bitmap mais, dans mon cas, j'avais
BaseAdapter
un ensemble deImageView
s pour unGridView
. J'ai modifié launbindDrawables()
méthode comme conseillé pour que la condition soit:mais le problème est alors que la méthode récursive ne traite jamais les enfants du
AdapterView
. Pour résoudre ce problème, j'ai plutôt fait ce qui suit:afin que les enfants de
AdapterView
soient toujours traités - la méthode n'essaye tout simplement pas de supprimer tous les enfants (ce qui n'est pas pris en charge).Cela ne résout pas tout à fait le problème, car ils
ImageView
gèrent un bitmap qui n'est pas leur arrière-plan. J'ai donc ajouté ce qui suit. Ce n'est pas idéal mais ça marche:Globalement, la
unbindDrawables()
méthode est alors:J'espère qu'il existe une approche plus raisonnée pour libérer de telles ressources.
la source
Bonne discussion Google I / O (2011) sur la gestion de la mémoire sous Android, ainsi que des détails sur les outils et les techniques de profilage de la mémoire:
http://www.youtube.com/watch?v=_CruQY55HOk
la source
Valgrind a été porté sur Android (sponsorisé par Mozilla). Voir Valgrind sur Android - État actuel et prise en charge de l'exécution de Valgrind pour Android sur ARM (commentaire 67).
la source
Eh bien, ce sont les outils qui correspondent aux formats uniques utilisés par Android ... Je pense que ce qui ne vous satisfait peut-être pas, c'est le cadre de code de test sous-jacent utilisé.
Avez-vous essayé de tester des zones de code simulées à l'aide de Android Mock Framework?
la source