Bonjour,
j'ai une application qui déclenche beaucoup de GC_EXTERNAL_ALLOC ,qui, si j'ai bien compris signifie que le GC essai de récupérer de la mémoire pour de nouveaux objets.
J'ai donc voulu utiliser les fonctions Heap et Allocation tracker du DDMS pour voir un peu ce qu'il se passe.
Le problème étant que je ne comprend pas grand chose au résultat obtenus :
Coté heap (voir pj) j'ai clairement 2 sources importantes de consommation mémoire , des tableaux de char et également "data object". mais à quoi cela correspond il ? "data object" à un nombre d'objet très élevé , peut être qu'il y'a moyen de travailler la dessus ?
Coté allocation tracker(voir pj) c'est un peu plus clair. Cependant je vois beaucoup d'allocation d'une même variable au sein d'un même thread.
Le rapport veux t'il dire que mon thread 10 consome 7x 50ko ?
Le buffer concerné contient une image récupéré via socket puis envoyé au threadUI via message. Le thread ne devrais donc à priori pas consommer plus que la taille d'une image (en omettant les petits objets annexes )
Extrais de l'utilisation du buffer :
Remplissage du buffer via la socket :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 //Allocation d'un buffer uniquement si supérieur au précédent if(this.lastJpgSize < tailleJPG || this.lastJpgSize == 0 || this.datas == null) this.datas = new byte[tailleJPG]; this.lastJpgSize = tailleJPG;
Création de l'image
Code : Sélectionner tout - Visualiser dans une fenêtre à part dataRead = this.client.getReader().read(this.datas, bufferOffset, (tailleData - dataLu));
Insertion de l'image dans un objet puis envoi de l'objet via message
Code : Sélectionner tout - Visualiser dans une fenêtre à part image = BitmapFactory.decodeByteArray(this.datas, 0, tailleJPG);
J'ai un taux de demande d'image fixé à 10 ips , cependant une demande n'est faite qu'une fois le message précédent envoyé , je ne comprend donc pas pourquoi autant d'allocation apparaisse.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Bitmap image = getImage(); imageCam.setImage(image); this.message = this.handler.obtainMessage(IMAGE_AVAILABLE,imageCam); handler.sendMessage(this.message);
Existe il des outils me permettant de voir clairement combien de mémoire mon application utilise et si possible quel partie du code le fait ?
merci pour votre aide
Partager