Bonjour,
Je rencontre actuellement un problème avec le Garbage Collector. Mon application va lire des images sur une socket pour les afficher dans une imageView.
La lecture peux se faire à plusieurs images par seconde.
Je tombe malheuresement souvent dans une boucle infinie du GC avec des truc du genre :
J'en déduit donc que je ne libère pas correctement la mémoire et que le GC doit le faire à ma place.06-15 11:24:59.176: DEBUG/dalvikvm(521): GC_FOR_MALLOC freed 9340 objects / 524152 bytes in 645ms
En lancant l'Allocation Tracker je me suis rendu compte qu'effectivement mon buffer servant à recevoir les données de la socket était alloué moulte fois :
.
Comment puis je faire en sorte d'améliorer ma gestion de mémoire sachant que mon code est géré comme suis :
N'est il pas possible de détruire simplement le tableau datas une fois qu'ila été passé à la BitmapFactory
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 private Bitmap readJPG() { byte[] header = new byte[30]; byte[] datas = new byte[0]; Bitmap image = null; int byteLu = 0; int dataLu = 0; int tailleJPG = 0; int nbPaquet = 1; int numPaquet = 0; int tailleData = 0; int bufferOffset= 0; int dataRead = 0; //Lecture des entêtes try { while(nbPaquet > numPaquet) { dataLu = 0; header = this.readImageHeader(); if(header != null) { if(numPaquet == 0) datas = new byte[tailleJPG]; //Allocation qui pose à mon avis problème while(dataLu < tailleData) { dataRead = this.client.getReader().read(datas, bufferOffset, (tailleData - dataLu)); dataLu += dataRead; bufferOffset += dataRead; } byteLu += dataLu; } } image = BitmapFactory.decodeByteArray(datas, 0, tailleJPG); datas = null; } catch (IOException e) { datas = null; } return image; }
Partager