2 votes

Pourquoi mon programme fuit la mémoire virtuelle?

À la recherche d'une fuite de mémoire, j'utilise MemProof et je peux voir en direct les compteurs des ressources utilisées, créées et détruites. Après avoir exécuté mon programme pendant plus d'un jour et demi, j'ai remarqué que tout le reste étant constant ou moins, la mémoire virtuelle (VM) augmente en nombres. Elle a démarré à 109 et maintenant elle est à 113 après 24 heures.

Voici ce que MemProof indique pour chaque fuite de VM :

VirtualAlloc(adresse_location, 16384, 4096, 4); Il est identifié comme Mémoire Virtuelle et sa taille est toujours de 16384. Le nom de l'API est VirtualAlloc. Le module est kernel32.dll.

De plus, memproof indique "virtualalloc réserve ou s'engage dans une région de pages dans l'espace d'adressage virtuel du processus appelant. Les pages allouées doivent être libérées avec virtualFree lorsqu'elles ne sont plus nécessaires."

La fuite de VM est associée à une fonction dans le fichier System.Pas.

La fonction est la suivante:

function GetCmdShow: Integer;
var
  SI: TStartupInfo;
begin
  Result := 10;                  { SW_SHOWDEFAULT }
  GetStartupInfo(SI);
  if SI.dwFlags and 1 <> 0 then  { STARTF_USESHOWWINDOW }
    Result := SI.wShowWindow;   
end;  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

J'ai les signes inférieurs pointant sur le mot clé "fin" où Memproof me conduit lorsque je clique sur la ou les fuites de mémoire virtuelle.

Alors, que cela signifie-t-il ?

5voto

Mason Wheeler Points 52022

Le gestionnaire de mémoire FastMM de Delphi fonctionne par-dessus le système de mémoire Windows. Il alloue de grands blocs de mémoire à partir du système d'exploitation avec VirtualAlloc, puis les divise en plus petites parties pour que votre programme les utilise. Si vous libérez de grandes quantités de mémoire, il en renverra une partie au système d'exploitation. En revanche, si vous libérez de petites quantités de mémoire, il est probable qu'il la conserve car vous risquez d'en avoir besoin à nouveau bientôt. C'est en partie ce qui rend FastMM rapide, et ce n'est pas une fuite de mémoire.

Tout profileur de mémoire qui se contente de surveiller VirtualAlloc sans vraiment prêter attention à ce que fait FastMM vous donnera des résultats qui n'ont pas de sens. Comme l'a mentionné David dans le commentaire, si vous souhaitez identifier de vraies fuites de mémoire, vous devez utiliser les outils FastMM. Téléchargez la version complète de FastMM sur SourceForge et lisez la documentation pour savoir comment activer FullDebugMode et les fonctionnalités de reporting et de journalisation des fuites, et vous aurez beaucoup moins de mal à y arriver.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X