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

C# Discussion :

libération mémoire dispose


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Par défaut libération mémoire dispose
    Bonjour à tous,
    j'ai créé un projet C# embarquant un serveur web, et qui à chaque appel http génère une liste d'objet en mémoire et un flux xml en retour.

    ça fonctionne parfaitement, sauf que la taille du processus augmente sans arrêt...
    newbee en C#, je pensais que la plateforme .net avait son propre garbage collector, mais il semblerait que mes listes d'objets ne soient pas libérées...

    j'ai cru voir qu'il fallait utiliser le "Dispose" avec le "Using" mais je n'arrive pas à intégrer ce code à mon code... y aurait il un exemple simple qqpart ?

    toute idée ou outil ou conseil pour mieux gérer la mémoire est le bienvenu !

    Christophe

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Pour les classes implémentant IDisposable, il est bien d'appeler Dispose dès que l'on en plus l'usage. Un bloc using appelle automatique Dispose, il n'y a pas à s'en préoccuper. Quels sont ces objets pouvant être disposés ? Nettoies-tu ta liste d'objets en mémoire ?

  3. #3
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 52
    Par défaut
    Salut,

    As-tu pensé à vider ta liste d'objet ?

    Sinon, essayes cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    GC.Collect();
    GC.WaitForPendingFinalizers();

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Il n'est pas recommandé d'appeler le Garbage Collector

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    Citation Envoyé par KRis Voir le message
    newbee en C#, je pensais que la plateforme .net avait son propre garbage collector, mais il semblerait que mes listes d'objets ne soient pas libérées...
    .net a bien un garbage collector pour sa mémoire, mais déjà le garbage collector passe quand il veut, ou plutot quand l'os dit à ton appli qu'il aurait besoin d'un peu de place (donc ca peut etre tard, mais dans un sens que ton appli prenne 200Mo de ram alors que 20 sont utilisés c'est pas grave car ca veut dire que les 180 personne n'en a besoin ...)
    mais aussi .net n'a pas réinventé totalement la roue, pour pas mal de chose, ca utilise des ressources de l'OS, par exemple les images en windows forms sont gérées par windows, donc dans ces cas là, les classes implémentent IDisposable qui fournit la méthode Dispose
    appeler cette méthode fait que la mémoire gérée en dehors de .net est libérée
    si tu veux comprendre un peu plus ces mécanismes, tu peux te renseigner sur dispose, finalize, managé et non managé, et aussi le mot clé using qui sert à faire un appel à dispose en sortie de bloc de code
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre émérite
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Par défaut
    Je pense qu' en utilisant la syntaxe suivant tu economisera en ressources :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    using (System.IO.StreamReader sr = new System.IO.StreamReader(@"C:\Users\Public\Documents\test.txt"))
    {
        string s = null;
        while((s = sr.ReadLine()) != null)
        {
            Console.WriteLine(s);
        }
    }
    Lien MSDN : http://msdn.microsoft.com/fr-fr/libr...(v=VS.90).aspx

    Have Fun

  7. #7
    Membre éclairé Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Par défaut
    Merci pour vos conseils,
    je relance ce petit sujet car c'est mieux mais pas encore ça...
    j'ai gagné en mémoire, mais j'ai toujours une montée progressive.

    et j'ai remarqué en affichant la colonne supplémentaire "nombre de threads" dans le gestionnaire de taches que mon service à chaque traitement créé un thread, résultat j'en ai 400 après 2 heures de traitement.
    Est ce cela qui consomme de la mémoire ?

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    y a des chances...
    un thread s'arrete à la fin du void sur lequel il démarre
    donc si tu as une boucle infinie ca expliquerait que le nombre grimpe sans cesse
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre éclairé Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Par défaut
    merci,
    je vois, bizarre je ne vois pas de boucle infinie... je vais faire quelques tests pour voir d'où ça peut venir...?

Discussions similaires

  1. Libération mémoire TSQLQuery
    Par obione dans le forum Bases de données
    Réponses: 9
    Dernier message: 28/03/2007, 10h02
  2. Problème de libération mémoire
    Par chrono23 dans le forum C++
    Réponses: 16
    Dernier message: 07/09/2006, 23h18
  3. Réponses: 3
    Dernier message: 14/03/2006, 05h19
  4. [COM] Libération mémoire
    Par MC2 dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 13/01/2006, 16h15
  5. FIREBIRD + APPLI EN C : Problèmes de libération mémoire
    Par lio33 dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 16/09/2005, 09h07

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