none
[vb.Net] Pourquoi le Close d'une frm ne libère pas la mémoire vive? RRS feed

  • Question

  • Bonjour,

    Je développe  une application sur laquelle il y a plusieurs frm. Je passe de l'une à l'autre au cours de l'utilisation de l'appli.

    Au démarrage c'est la fenêtreA qui s'ouvre et la mémoire vive utilisée est de 45Mo.

    Lorsque je passe de la fenêtreA à la fenêtreB j'utilise un fenêtreB.Show puis un fenêtreA.Hide. A ce moment là la mémoire vive utilisée est de 80Mo.

    Si je veux revenir sur la fenêtreA je fais un fenêtreA.Show et un fenêtreB.Close et dans ce cas la mémoire vive reste toujours à 80Mo ! (dans la logique des choses, un Close aurait du libérer ce qui avait été utilisé!).

    Pour compliquer le tout, si je fais de nouveau un accès à la fenêtreB alors la mémoire vive augmentera de 15Mo ...
     
    En continuant de cette manière, la mémoire vive risque vite d'être saturée et (ça m'est déjà arrivé une fois) de provoquer un OutOfMemory.

    Qu'est ce que je peux ou dois faire pour libérer la mémoire non utilisée d'une frm qui est fermée?

    Cordialement,

    Julien
    mardi 7 avril 2009 07:49

Réponses

  • De manière générale, tout le problème vient du fait que c'est le Garbage Collector qui détermine si il peut ou non libérer la mémoire. Tu as deux solutions pour t'assurer que le GC va le faire :
    - T'assurer que la variable que tu utilises pour créer ta Form n'est plus accessible (hors de portée).
    - Forcer ta variable à null.

    Dans les deux cas, tu peux aussi ajouter un appel à la méthode Dispose() de ta Form (après le Close) de manière à optimiser la libération de mémoire. Et ça tu peux le garder comme règle générale: quand une classe te propose la méthode Dispose, utilise-la ...
    Xavier
    mardi 21 avril 2009 14:41

Toutes les réponses

  • vous pouvez essayer de libérer la mémoire de fenêtreB, rendant
    fenêtreB.Close ();
    et
    fenêtreA.Show ();
    En la teoría, la teoría es igual a la práctica; en la práctica no
    mercredi 8 avril 2009 05:02
  • De manière générale, tout le problème vient du fait que c'est le Garbage Collector qui détermine si il peut ou non libérer la mémoire. Tu as deux solutions pour t'assurer que le GC va le faire :
    - T'assurer que la variable que tu utilises pour créer ta Form n'est plus accessible (hors de portée).
    - Forcer ta variable à null.

    Dans les deux cas, tu peux aussi ajouter un appel à la méthode Dispose() de ta Form (après le Close) de manière à optimiser la libération de mémoire. Et ça tu peux le garder comme règle générale: quand une classe te propose la méthode Dispose, utilise-la ...
    Xavier
    mardi 21 avril 2009 14:41