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 :
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 :

.

Comment puis je faire en sorte d'améliorer ma gestion de mémoire sachant que mon code est géré comme suis :

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;
}
N'est il pas possible de détruire simplement le tableau datas une fois qu'ila été passé à la BitmapFactory