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

madcap 77 Messages postés mercredi 15 mars 2006Date d'inscription 22 février 2011 Dernière intervention - 5 juin 2009 à 13:54 - Dernière réponse : Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention
- 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
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 8 juin 2009 à 11:53
3
Merci
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.

Merci cs_rt15 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de cs_rt15
Meilleure réponse
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 8 juin 2009 à 15:58
3
Merci
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 !

Merci Bacterius 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de Bacterius
beckerich 308 Messages postés jeudi 29 septembre 2005Date d'inscription 17 septembre 2013 Dernière intervention - 6 juin 2009 à 03:03
0
Merci
bonsoir,

sans code, pas d'aide possible...

Luc.
Commenter la réponse de beckerich
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 6 juin 2009 à 10:08
0
Merci
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é.
Commenter la réponse de cs_rt15
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 6 juin 2009 à 17:38
0
Merci
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 !
Commenter la réponse de Bacterius
madcap 77 Messages postés mercredi 15 mars 2006Date d'inscription 22 février 2011 Dernière intervention - 8 juin 2009 à 09:58
0
Merci
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 ?
Commenter la réponse de madcap
madcap 77 Messages postés mercredi 15 mars 2006Date d'inscription 22 février 2011 Dernière intervention - 8 juin 2009 à 15:47
0
Merci
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 ?
Commenter la réponse de madcap

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.