Service Windows - Gestion de la mémoire [Résolu]

Signaler
Messages postés
77
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
22 février 2011
-
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
-
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

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
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.
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
7
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 !
Messages postés
302
Date d'inscription
jeudi 29 septembre 2005
Statut
Membre
Dernière intervention
17 septembre 2013
1
bonsoir,

sans code, pas d'aide possible...

Luc.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
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é.
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
7
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 !
Messages postés
77
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
22 février 2011

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 ?
Messages postés
77
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
22 février 2011

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 ?