Service Windows - Gestion de la mémoire

Résolu
madcap Messages postés 77 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 22 février 2011 - 5 juin 2009 à 13:54
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Derniè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 ?

Merci de votre aide

7 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
8 juin 2009 à 11:53
Débat sur le Garbage collector.



Normalement, si tu créés un objet avec un owner, il est détruit quand le owner est détruit.
Si tu ne mets pas de owner, c'est à toi de le détruire.

Free est mieux que Destroy dans le sens où il vérifie que l'objet n'est pas nil avant d'appeler Destroy.

Les String se libèrent toute de seule. Pas besoin d'affecter à une chaîne vide.
3
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
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.

Cordialement, Bacterius !
3
beckerich Messages postés 302 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 17 septembre 2013 2
6 juin 2009 à 03:03
bonsoir,

sans code, pas d'aide possible...

Luc.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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é.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
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é ?

Cordialement, Bacterius !
0
madcap Messages postés 77 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 22 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 ?
0
madcap Messages postés 77 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 22 février 2011
8 juin 2009 à 15:47
Merci pour ta réponse rt15,

Et si je met un owner, est-ce que je peux détruire l'objet manuellement ? ou bien ça n'a pas de sens ?
0
Rejoignez-nous