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 :

Problème de fuite mémoire


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Par défaut Problème de fuite mémoire
    Bonjour à tous.
    Pour information, je bosse sous Winform et j'ai un cas tout bête que je ne comprends pas.

    Voici un exemple :
    J'ai une Form1 (de type Form) qui est un conteneur MDI (IsMDIContainer = True). J'ai une Form2 (de type Form), avec simplement de nombreux boutons.
    Avec la Form1 j'instancie une Form2 : mon application gagne 1,5 Mo en mémoire.
    Je ferme Form2 (je passe dans l'événement "FormClosed") et mon appli ne libère rien en mémoire.

    Comment faire pour libérer ces 1,5 Mo en mémoire? J'ai cherché sur la toile et je ne trouve rien. Les destructeurs sont inutiles apparemment et le GC est à proscrire.

    SVP de l'aide

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Si MyForm2 est une variable de type Form2 déclarée dans la classe Form1 (ce n'est pas une variable interne à une des procedures de Form1), fermerMyForm2 ne suffit pas à libérer la mémoire.
    Il faut aussi faire "MyForm2=null" après la fin du FormClosed.

  3. #3
    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
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Par défaut
    Merci pour vos retours et désolé pour ma réactivité.

    Graffito :
    Mon exemple n'était pas "architecturé" comme le tiens.
    Dans mon programme, MyForm2 était déclaré dans une des procedures de Form1. Ceci étant, en déclarant MyForm2 dans la classe Form1, j'ai le même résultat.
    Pour info je fais :

    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
     public partial class Form1 : Form
        {
            Form2 FForm2;
     
            public Form1()
            {
                InitializeComponent();
            }
     
    	// Création de la FForm2
            private void form2ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                FForm2 = new Form2();
                FForm2.Visible = true;
            }
     
    	// Code appelé après le "FormClosed du Form2" 
            private void tuerForm2ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                FForm2 = null;
            } 
        }
    Dans l'ordre je fais form2ToolStripMenuItem_Click, puis tuerForm2ToolStripMenuItem_Click (après avoir fermer Form2).


    Pol63:
    Si je comprends bien faire des dispose (à quel moment? FormClosed()? ) c'est tout ce qu'on peut faire?
    En fait pour information j'ai développé un programme avec une architecture MDI, dans lequel j'ai une dizaine de fenêtres (Form) ouvrables. Si j'ouvre toutes les fenêtres l'application (qui démarre à 85 Mo (j'ouvre directement une form avec pas mal de composants, dont des images)) peut monter à 300 Mo (j'ai pas de Form avec des images, etc). Si je ferme tout je retombe à 200 Mo.
    1er cas : Si j'en réouvre plusieurs, le programme freeze et j'ai un "Timeout while getting a connection from pool".
    2eme cas : Si j'attends 5 minutes sans rien faire, la mémoire alloué ne diminue pas.

    Je suis un peu perdu devant ce "gros" problème...

  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
    mon lien devait mener à une discussion où je disais que s'inquiéter pour 1.5Mo en .net est inutile

    après si on arrive à 300Mo on peut en effet commencer à discuter

    si c'est toi qui ferme les fenetres avec .close, utilises .dispose à la place (l'instance est alors inutilisable, parce que certains utilisent la même instance et ne font que la cacher)
    si c'est l'utilisateur avec la croix tu peux alors appeler .dispose dans l'event formclosed


    concernant ton timeout sur le pool de connexion, ca ressemble à un mauvais codage, genre ouvrir vraiment trop de connexion
    après voir dans le détail de l'erreur si c'est le pool d'ado.net ou le pool de la base de données


    sinon j'ai un autre lien avec des explications sur la gestion de la mémoire en .net :
    http://www.developpez.net/forums/d15...n/#post8219865
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    mon lien devait mener à une discussion où je disais que s'inquiéter pour 1.5Mo en .net est inutile

    après si on arrive à 300Mo on peut en effet commencer à discuter

    si c'est toi qui ferme les fenetres avec .close, utilises .dispose à la place (l'instance est alors inutilisable, parce que certains utilisent la même instance et ne font que la cacher)
    si c'est l'utilisateur avec la croix tu peux alors appeler .dispose dans l'event formclosed


    concernant ton timeout sur le pool de connexion, ca ressemble à un mauvais codage, genre ouvrir vraiment trop de connexion
    après voir dans le détail de l'erreur si c'est le pool d'ado.net ou le pool de la base de données


    sinon j'ai un autre lien avec des explications sur la gestion de la mémoire en .net :
    http://www.developpez.net/forums/d15...n/#post8219865
    Dans mon application, c’est l’utilisateur qui ferme les fenêtres et j’utilise toujours le Dispose(). Le problème c’est que je ne dispose que les objets créés dans les méthodes (exemple : clic sur un bouton), mais pas ceux instancié automatiquement à la création de la Form. Du coup dans chaque Form, je vais rajouter un évenement FormClosed() dans lequel je vais « disposer » mes objets instancié à la création de la Form.

    Effectivement je dois ouvrir beaucoup de connexion BD sans les refermer.
    Voici la trace lorsque j’ouvre le calendrier, qui prouve que tu as vu juste :

    Consultez la fin de ce message pour plus de détails sur l'appel du débogage
    juste-à-temps (JIT) à la place de cette boîte de dialogue.

    ************** Texte de l'exception **************
    System.Exception: Timeout while getting a connection from pool.
    à Npgsql.NpgsqlConnectorPool.RequestPooledConnector(NpgsqlConnection Connection)
    à Npgsql.NpgsqlConnectorPool.RequestConnector(NpgsqlConnection Connection)
    à Npgsql.NpgsqlConnection.Open()
    à Cyclisme.TfmCalendrier..ctor()
    à Cyclisme.MainForm.miCalendrier_Click(Object sender, EventArgs e)
    à System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
    à System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
    à System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
    à System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
    à System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
    à System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
    à System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
    à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
    à System.Windows.Forms.Control.WndProc(Message& m)
    à System.Windows.Forms.ScrollableControl.WndProc(Message& m)
    à System.Windows.Forms.ToolStrip.WndProc(Message& m)
    à System.Windows.Forms.MenuStrip.WndProc(Message& m)
    à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    à System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


    ************** Assemblys chargés **************
    mscorlib
    Version de l'assembly*: 4.0.0.0
    Version Win32*: 4.0.30319.34209 built by: FX452RTMGDR
    CodeBase*: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
    ----------------------------------------
    Cyclisme
    Version de l'assembly*: 1.0.5394.39926
    Version Win32*: 1.0.5394.39926
    CodeBase*: file:///C:/Program%20Files%20(x86)/Cyclisme/Cyclisme.exe
    ----------------------------------------
    System.Windows.Forms
    Version de l'assembly*: 4.0.0.0
    Version Win32*: 4.0.30319.34209 built by: FX452RTMGDR
    CodeBase*: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
    ----------------------------------------
    System.Drawing
    Version de l'assembly*: 4.0.0.0
    Version Win32*: 4.0.30319.34209 built by: FX452RTMGDR
    CodeBase*: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
    [...]Blah Blah Blah[...]
    ************** Débogage JIT **************
    Pour activer le débogage juste-à-temps (JIT), le fichier de configuration pour cette
    application ou cet ordinateur (machine.config) doit avoir la valeur
    jitDebugging définie dans la section system.windows.forms.
    L'application doit également être compilée avec le débogage
    activé.

    Par exemple*:

    <configuration>
    <system.windows.forms jitDebugging="true" />
    </configuration>

    Lorsque le débogage juste-à-temps est activé, les exceptions non gérées
    seront envoyées au débogueur JIT inscrit sur l'ordinateur
    plutôt que d'être gérées par cette boîte de dialogue.



    De plus, je suis allé un peu vite avec cet appli. Je crée un composant « connection » (NpgsqlConnection) dans chaque Form. Je vais faire en sorte d’utiliser celui créée dans la MDI Form, dans les Form non MDI.

    Merci beaucoup pour tes explications.
    Je vais rectifier le tir et voir ce que cela donne.

Discussions similaires

  1. [OpenOffice][Tableur] problème de fuites mémoires
    Par sephial dans le forum OpenOffice & LibreOffice
    Réponses: 0
    Dernier message: 23/11/2009, 17h26
  2. Problème de fuites mémoire
    Par Le Barde dans le forum C++
    Réponses: 12
    Dernier message: 02/09/2007, 08h49
  3. [VB6] Problème de fuite mémoire
    Par GyLes dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/03/2007, 14h58
  4. [C++] problème de fuite mémoire
    Par Cirdan Telemnar dans le forum C++
    Réponses: 26
    Dernier message: 16/06/2006, 10h16
  5. Problème de fuite mémoire sur un idFTP
    Par jeromelef dans le forum Composants VCL
    Réponses: 6
    Dernier message: 26/07/2005, 17h29

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