IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Limiter les GC_FOR_MALLOC


Sujet :

Android

  1. #1
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut 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 :
    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
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  2. #2
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Un des principes du développements mobiles : Réutiliser ce qui est réutilisable.

    En gros, si tu alloues de la mémoire, essaye de réutiliser cet emplacement si possible au maximum, celà évitera au GC de passer régulièrement vider cette mémoire inutilisée.

    Pourquoi avoir mis un test sur "numPaquet == 0" dans ta boucle ? alors que tu pourrais le faire juste avant la boucle ?
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Pourquoi avoir mis un test sur "numPaquet == 0" dans ta boucle ? alors que tu pourrais le faire juste avant la boucle ?
    Parce que avant ma boucle je ne connais pas la taille de mon image à allouer (j'ai simplifier la code de la boucle pour aller à l'essentiel).

    J'ai remonter le tableau datas dans les attributs de la classe plutôt que de le garder localement.
    J'ai l'impression que ça va mieux niveau allocation , mais le problème persiste.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    Pourquoi ne pas faire comme le reallocate sous C++.

    tu réalloues ta variable que si la nouvelle taille est supérieure à l'ancienne, comme cela tu laisses la mémoire tranquille dans un premier temps. Si elle est supérieure ,tu l'alloues à nouveau.
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Bonjour,

    Pourquoi ne pas faire comme le reallocate sous C++.

    tu réalloues ta variable que si la nouvelle taille est supérieure à l'ancienne, comme cela tu laisses la mémoire tranquille dans un premier temps. Si elle est supérieure ,tu l'alloues à nouveau.
    L'idée est intéressante !


    J'ai réglé le problème de GC_FOR_MALLOC qui était en fait du à des erreurs de lecture sur ma socket dans le thread. En revanche l'optimisation des allocations reste intéressant
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/09/2005, 10h53
  2. Composant pour limiter les décimales à deux
    Par Droïde Système7 dans le forum Composants VCL
    Réponses: 9
    Dernier message: 20/08/2005, 12h00
  3. Limiter les déplacement de la souris a la fenetre
    Par Mathieu.J dans le forum OpenGL
    Réponses: 22
    Dernier message: 11/06/2004, 12h55
  4. Limiter les 30dernière liste de données?
    Par SkyDev dans le forum Langage SQL
    Réponses: 11
    Dernier message: 08/03/2004, 17h01
  5. Comment limiter les mouvements du curseur??
    Par scorpiwolf dans le forum C++Builder
    Réponses: 9
    Dernier message: 07/07/2002, 22h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo