Limiter les GC_FOR_MALLOC
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 :
Citation:
06-15 11:24:59.176: DEBUG/dalvikvm(521): GC_FOR_MALLOC freed 9340 objects / 524152 bytes in 645ms
J'en déduit donc que je ne libère pas correctement la mémoire et que le GC doit le faire à ma place.
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 :
http://imagik.fr/thumb/432403.jpeg.
Comment puis je faire en sorte d'améliorer ma gestion de mémoire sachant que mon code est géré comme suis :
Code:
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;
} |
N'est il pas possible de détruire simplement le tableau datas une fois qu'ila été passé à la BitmapFactory