madcap
Messages postés77Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention22 février 2011
-
5 juin 2009 à 13:54
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 2016
-
8 juin 2009 à 15:58
Bonjour à tous,
J'ai développé un service Windows en Delphi qui interroge un WS chaque X temps pour récupérer des données et les insérer dans une base de données. Tout fonctionne, je peux gérer mon service, j'y ai inséré un TrayIcon, mais j'ai un souci : La mémoire.
Si je vais dans le gestionnaire de tâches de Windows, mon service prend de plus en plus de mémoire. A chaque appel du WS, j'ai environ 60ko qui s'incrémentent. J'ai essayé de vider tous les objets que je n'utilise plus en utilisant FreeAndNil, mais j'ai toujours une légère augmentation de la mémoire...
Est-ce qu'il y a un moyen pour dire à l'appli de vider les objets non utilisés ? Il y a pas une sorte de GarbageCollector sous Delphi ? Comment ça se fait que j'ai ça que si mon projet est un service Windows et qu'avec une appli Win32 normale la mémoire est auto-gérée ?
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 8 juin 2009 à 15:58
Si tu mets un owner, le mécanisme de libération de mémoire Delphi va faire en sorte que les owners libèrent tous les enfants (qui peuvent à leur tour libérer leurs enfants) avant de se libérer eux-mêmes. Si tu libères un objet qui a un owner manuellement, tu auras au mieux une violation d'accès.
Un garbage collector est à mon sens mauvais, aucun algorithme ne peut remplacer le bon sens du développeur. Et le mécanisme de libération hierarchisée que Delphi propose me semble tout à fait correct.
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 6 juin 2009 à 10:08
Bonjour,
Par chance, Delphi ne propose pas (encore...) de garbage collector. J'ai assez vu les dégâts que cela faisait en java dans une application chargée.
Tu peux essayer de regarder du côté de FastMM, qui dispose d'un genre de usage tracker, pour détecter les memory leaks. Mais je m'en suis jamais servi, désolé.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 6 juin 2009 à 17:38
La mémoire n'est pas auto-gérée. Passe nous le code susceptible d'être en rapport avec ce problème (type des objets créés et libérés, création des objets, libération des objets). Et as-tu pensé à faire un ShowMessage('Libération') par exemple avant la libération des objets pour voir si ce code était bien exécuté ?
madcap
Messages postés77Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention22 février 2011 8 juin 2009 à 09:58
rt15, pourquoi dis-tu, par chance Delphi ne propose pas de garbage collector ? Pour toi le GB c'est un nid à bug mémoire ?
J'ai vraiment bcp de code dans mon appli je ne vois pas trop qu'est-ce que je pourrais vous donner comme morceaux de code pour que vous puissiez facilement m'aider. Par contre il y a une partie du code qui me semble poser problème au niveau de la mémoire. Je m'explique :
J'ai un composant qui s'appelle THTTPRIO qui me permet de gérer un WS.
Si à la création je ne le lie pas à une fiche, il va se détruire
directement après sa 1ère utilisation. Comme mon WS à une méthode qui
permet l'authentification sur le serveur afin d'utiliser différentes
fonctions plus tard, si THTTPRIO se détruit, je dois réeffectuer un appel à la fonction
login à chaque fois ainsi que la création de ce composant... Et ça je veux éviter.
Du coup, je le lie à ma fiche du Service Windows. Mais alors lorsque je veux le détruire (monWS.destroy()), vu qu'il est lié à la fiche, il me semble qu'il se détruit pas comme il faut... Ma question est donc : Est-ce que je peux toutefois détruire ce composant manuellement même s'il est lié à une fiche ?
Exemple de création du composant avec un owner : HTTPRIOWS := THTTPRIO.Create(aOwner);
Exemple de création du composant sans owner : HTTPRIOWS := THTTPRIO.Create(nil); --> compteur de référence à zéro, automatiquement supprimé...
J'ai encore deux questions par rapport à la libération des
objets. J'utilise FreeAndNil ou Destroy pour libérer des objets, est-ce bien ?
Est-ce que les variables de types string, integer, doivent être
réinitialisée pour libérer la mémoire ? Si oui, est-ce myString := '';
suffit ?