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

Composants VCL Delphi Discussion :

application ne libère pas le memoire [FAQ]


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 76
    Par défaut application ne libère pas le memoire
    Bonjour,

    J’ai une application en delphi qui doit être tournée en permanence 24h/24 et 7j/7. Et au bout de temps cette application consomme les ressources (le mémoire) pour exécuter les opérations différentes mais ensuit elle ne les libère pas. Dans ce programme tous les objets créés sont libérés par FreeAndNil. Mais il y a aussi des pointeurs et je ne sais pas trop est-ce que cette consommation exagérée peut venir de la. Est-ce que quelqu’un sais où est le problème ?

    Merci.

  2. #2
    Membre éclairé Avatar de Matt2094
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    295
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 295
    Par défaut
    Je ne suis pas éxpert, mais je pense que le système d'éxploitation, voyant que l'application tourne tout le temps, ne libère pas la mémoire : il essaye de prévoir le prochain chargement de l'appli ...

  3. #3
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Difficile dire ou est le pb

    peut-être constater une montée en mémoire et pas de redescente lors de l'utilisation de certaines fonction.

    Bien vérifier que non seulement les Create on des Free. (mais j'imagine que c'est déjà fait)

    Bien vérifier également les objets créés et attachés à des listes:
    par exemple un TStringList.AddObject( 'xxx', MonObjetCrééDynamiquement)

    Un FreeAnNil de la liste de suffit pas, il faut libérer auparavant les objets de la liste.

    bon courage car les fuites c'est jamais simple
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  4. #4
    Membre expérimenté
    Avatar de HumanTool
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 276
    Par défaut
    salut,
    une allocation de memoire une fois qu'elle a été faite ne se réduit pas automatiquement, sauf si tu détruis l'objet qui l'occupe.
    Tu as certainement des variables ou objets qui, pour une raison ou une autre, ont eu besoin de s'allouer plus d'espace mémoire mais qui du coup ne la relache pas une fois leur opérations terminée.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 76
    Par défaut
    En fait les pointeurs sont assez largement utilisés, mais se sont les variables locales declarées dans les fonctions privées d'un thread. La procédure "New" est utilisé pour allouer le memoire, mais je ne vois aucune procédure utilisée ("Dispose" par exemple) pour le libèrer. Peut être ce n'est pas necessaire pour les variables-pointeurs locales?

  6. #6
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    si, il est nécessaire de faire des dispose pour libérer même si le pointeur est local.
    enfin, là tu me mets le doute vu que je les utilise plus trop, mais il n'y a pas de raison que delphi le fasse.
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  7. #7
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    En effet, tu dois absolument équilibré chaque appel à new par un appel à Dispose, de la même façon que chaque appelle à un constructeur doit être équilibré d'un appel au destructeur.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 76
    Par défaut
    Merci à tout le monde. Je vais libèrer les pointeurs et voir s'il y a encore la fuite de memoire.

  9. #9
    Membre confirmé Avatar de DarkChamallo
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 113
    Par défaut merci
    Hello,

    merci pour ces interventions, ça m'a appris l'astuce FreeandNil ce qui a stabilisé quand même une appli test que j'ai fait et avec laquelle je rencontrais effectivement ce type de problème (mémoire bouffée progressivement, à tel point qu'au bout d'une heure d'exécution un message d'erreur de plantage que je n'avais jamais vu auparavant (sans icône et sans bordure) expliquait que les ressources systèmes étaient insuffisantes.

    Alors de 15 Mo de mémoire utilisés au démarrage de mon appli (et ça augmente de 10 ko progressivement) j'ai une astuce qui libère tout sans incident et qui ramène à 400 Ko ! (ensuite ça remonte à 4 Mo, et la progression reprend) :

    toutes les 10 minutes je fais un :

    Application.Minimize;
    Application.Restore;

    et YOUPI !!!!!



    Radicalement efficace et propre (un léger scintillement de la fenêtre peut être perçu, mais toutes les 10 minutes c'est acceptable )

    Voilà !

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    409
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 409
    Par défaut
    voici une procédure équivalente et qui t'évitera le scintillement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure FreeMemory;
    var
      MainHandle : THandle;
    begin
      MainHandle := OpenProcess(PROCESS_ALL_ACCESS, FALSE,
    GetCurrentProcessID);
     try
      SetProcessWorkingSetSize(MainHandle, $FFFFFFFF, $FFFFFFFF);
     finally
      CloseHandle(MainHandle);
     end;
    end;

  11. #11
    Membre confirmé Avatar de DarkChamallo
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 113
    Par défaut merci
    Excellent
    Merci !!

  12. #12
    Membre chevronné Avatar de chtiot
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 385
    Par défaut
    merci ExoSeven, ton astuce que je ne connaissais pas m'a permis de stabiliser une application pour laquelle je desespérais de trouver une solution à un problème de mémoire

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pb réseau, n'arrive pas à vider memoire arp
    Par gretch dans le forum Windows XP
    Réponses: 1
    Dernier message: 07/07/2006, 12h28
  2. [VS.Net 2005][ClickOnce] Mon application ne démarre pas
    Par Vonotar dans le forum Visual Studio
    Réponses: 3
    Dernier message: 07/12/2005, 14h44
  3. [JDialog] La mémoire ne se libère pas au dispose()
    Par bugalood dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 01/09/2005, 22h31
  4. Réponses: 12
    Dernier message: 02/05/2005, 17h16
  5. Une application Dialog based pas rectangulaire....
    Par feed_our_vision dans le forum MFC
    Réponses: 2
    Dernier message: 14/06/2004, 10h10

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