Forum Programmation.c# fuite mémoire

Posté par (page perso) .
1
20
oct.
2010

Bonjour,


J'ai un gros soucis de fuite de mémoire dans un code maison.
Le programme charge un millier d'objets pour une occupation mémoire de 150Mo environ (ce qui est déjà énorme mais pas encore le soucis). Chaque objet quand il est travaillé charge une cinquantaine d'objets similaire en plus, puis on détruit l'objet travaillé.


L'occupation mémoire commence donc à 150Mo puis grimpe à 1,5Go pour redescendre à 40Mo selon le gestionnaire des tâches avant de crasher.


L'occupation mémoire commence à 150Mo puis grimpe jusqu'à 1,7Go avant de crasher selon MyProcess.PrivateMemorySize64.


L'occupation mémoire géré par le garbage collector reste à 20Mo environ.



Je cherche donc des pistes pour savoir où je merde.



List lADObject = ADSearcher.findAllObjects(ad, String.Empty, true);
while (lADObject.Count != 0)
{
ADObject ado = lADObject[lADObject.Count - 1];
insertADObject(ado);
lADObject.Remove(ado);
ado=null;
}
  • # ahah

    Posté par (page perso) . Évalué à -7.

    ahahah =)

    C'est quoi le c# ? la daube de microsoft ? a moins que tu taff sous mono :p
    • [^] # Re: ahah

      Posté par (page perso) . Évalué à 0.

      Retourne t'acheter une dose de biactol*. Tu ressemble à un gruyère.
      • [^] # Re: ahah

        Posté par . Évalué à 3.

        Bon ce sera une dose de biactol* pour moi aussi alors !

        Mais sinon, outre le fait que poser une question C# sur linuxfr.org reste un énorme troll, en lisant les 7 lignes de codes ala Allman avec mes lunettes de wanabee dev C++, je vois:
        * une liste "lADobject" qui semble remplie et vidée correctement
        * un puits magique où les éléments "ado" disparaissent avec "insertADObject"
        * un élément source "ad" d'où proviennent les objets mais _qu'on ne vide jamais_.

        Voilà donc t'aurais pas oublier de faire un pseudo remove "ado" from "ad"; ?

        sinon tu peux utiliser Haskell, c'est aussi développé par trois barbus de MS Research mais ils ont au moins le bon goût de fournir des outils de profiling pour ce genre de soucis :p
        • [^] # Re: ahah

          Posté par . Évalué à 2.

          [coup de gueule]

          Ce qui m'énerve le plus dans C#, outre le fait qu'il essaie de copier python sans jamais lui arriver à la cheville, c'est le nom des méthodes.

          "findAllObjects" : faut être sérieusement atteint et irréfléchi pour pondre des merdes pareilles. "findAll" aurait été largement suffisant. Ici faut encore se rappeler de "Object" et savoir si on le met au singulier ou pluriel (wai je sais "all" donc plusieurs mais bon, si en plus je dois connaître l'orthographe anglais). Tous les jours je peste contre ce langage, imposé au boulot ;( (Enfin je me réconforte en me disant que mon collègue à côté est tombé sur windev).

          Bref, il y a 10.000 méthodes comme ça et honnêtement sans visualStudio et la complétion je suis une vraie brelle en c#.

          [/coup de gueule]
          • [^] # Re: ahah

            Posté par . Évalué à 4.

            Ce qui m'énerve le plus dans C#, c'est qu'il ne soit ni libre ni utilisable sur mon GNU/Linux.

            comment ça je m'écarte du sujet ?
          • [^] # Re: ahah

            Posté par . Évalué à 1.

            "findAllObjects" : faut être sérieusement atteint et irréfléchi pour pondre des merdes pareilles.

            Qu'est-ce qui te fait dire c'est une méthode du framework et pas une méthode d'une classe du monsieur ?
            Dans le framework, des règles de nommage strictes sont appliquées.
            - Pascal casing (ce serait plus FindAllObjects dans ce cas).
            - La notation hongroise est découragée (le lADObject préfixé par un "l" pour dire que c'est une liste).

            Donc visiblement c'est du code maison. Du coup, toutes tes remarques "ton langage est moins bien que le mien" font plop.
          • [^] # Re: ahah

            Posté par . Évalué à 3.

            Bref, il y a 10.000 méthodes comme ça et honnêtement sans visualStudio et la complétion je suis une vraie brelle en c#.

            C'est bien, tu viens de comprendre que la valeur d'un ingenieur ce n'est pas ce qu'il connait par coeur, mais son systeme de pensee.

            Que le nom de la methode soit un probleme sans completion tout le monde s'en fout, il n'y a aucune raison qui t'empecherait d'utiliser la completion.
      • [^] # Re: ahah

        Posté par (page perso) . Évalué à 5.

        à un Emmental à la limite, mais un gruyère n'a pas de trous.
  • # C'est bon, c'est fini

    Posté par (page perso) . Évalué à 2.

    Merci à ceux qui on planché sur ce problème (et aux autres pour ne pas avoir pourri le thread) mais j'ai fini par trouver la cause. Il s'agit de l'objet de class System.DirectoryServices.SearchResultCollection qui doit être Dispose() de manière explicite selon http://msdn.microsoft.com/en-us/library/system.directoryserv(...) , et je confirme que désormais le programme ne dépasse pas les 80Mo de charge mémoire (ça reste encore un peu trop mais déjà beaucoup moins gênant).

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.