J'utilise Delphi 2009 qui intègre le gestionnaire de mémoire FastMM4.Pourquoi la mémoire de mon programme Delphi continue-t-elle de croître?
Mon programme lit et traite un grand ensemble de données. Toute la mémoire est libérée correctement chaque fois que j'efface l'ensemble de données ou quitte le programme. Il n'a pas de fuites de mémoire du tout. En utilisant la routine CurrentMemoryUsage donnée dans la réponse de spenwarr à: How to get the Memory Used by a Delphi Program, j'ai affiché la mémoire utilisée par FastMM4 pendant le traitement.
Ce qui semble se produire, c'est que la mémoire est en train d'augmenter après chaque cycle de processus et de publication. par exemple:
1,456 Ko utilisé après le démarrage de mon programme sans jeu de données.
218,455 Ko utilisé après le chargement d'un grand ensemble de données. 71,994 Ko après suppression complète de l'ensemble de données. Si je sors à ce point (ou à n'importe quel point dans mon exemple), aucune fuite de mémoire n'est signalée.
271,905 Ko utilisé après le chargement du même jeu de données.
125,443 Ko après suppression complète de l'ensemble de données.
325,519 Ko utilisé après avoir rechargé le même jeu de données.
179,059 Ko après suppression complète de l'ensemble de données.
378 752 Ko utilisé après le chargement du même jeu de données.
Il semble que l'utilisation de la mémoire de mon programme augmente d'environ 53 400 Ko à chaque cycle de chargement/déchargement. Le gestionnaire des tâches confirme que cela se passe réellement. J'ai entendu dire que FastMM4 ne libère pas toujours toute la mémoire du programme sur le système d'exploitation lorsque les objets sont libérés afin de pouvoir garder de la mémoire quand il en a besoin. Mais cette croissance continuelle me dérange. Comme aucune fuite de mémoire n'est signalée, je ne peux pas identifier un problème. Est-ce que quelqu'un sait pourquoi cela se produit, s'il est mauvais, et si je peux ou dois faire quelque chose à ce sujet?
Merci dthorpe et Mason pour vos réponses. Tu m'as fait réfléchir et essayer des choses qui m'ont fait réaliser qu'il me manquait quelque chose. Un débogage aussi détaillé était nécessaire.
En fin de compte, toutes mes structures étaient correctement libérées à la sortie. Mais la libération de la mémoire après chaque cycle pendant la course n'était pas. C'était accumuler des blocs de mémoire qui auraient normalement causé une fuite qui aurait été détectable à la sortie si mon nettoyage de sortie n'était pas correct - mais c'était le cas.
Il y avait des StringLists et d'autres structures dont j'avais besoin pour effacer entre les cycles. Je ne suis toujours pas sûr de la façon dont mon programme a fonctionné correctement avec les données supplémentaires encore présentes dans les cycles précédents, mais c'est le cas. Je ferai probablement des recherches plus approfondies.
Cette question a été répondue. Merci de votre aide.
à mon humble avis, vous devriez avoir ajouté votre réponse et accepté au lieu de modifier la question. Il est plus facile à quelqu'un qui s'occupe de trouver la question, la réponse et d'apprendre de votre expérience. – EMBarbosa