2 votes

Pourquoi mon programme fuit-il la mémoire virtuelle ?

À la recherche de fuites de mémoire, j'ai utilisé MemProof et pu voir en direct les comptes 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 nombre. Elle a commencé à 109 et maintenant elle est à 113 après 24 heures.

Voici ce que MemProof dit pour chaque fuite de VM:

VirtualAlloc(adresse_emplacement, 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é "end" là où Memproof me conduit lorsque je clique sur la ou les fuites de mémoire virtuelle(s).

Alors, que cela signifie-t-il?

5voto

Mason Wheeler Points 52022

Le gestionnaire de mémoire FastMM de Delphi fonctionne au-dessus du 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 petits morceaux pour que votre programme puisse les utiliser. Si vous libérez de grandes quantités de mémoire, il en rendra 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 les garde car vous en aurez probablement besoin à nouveau bientôt. C'est en partie ce qui rend FastMM rapide, et ce n'est pas une fuite de mémoire.

Toute profilateur de mémoire qui ne surveille que VirtualAlloc et ne prête pas réellement attention à ce que fait FastMM va vous donner des résultats qui n'ont pas de sens. Comme David l'a mentionné dans le commentaire, si vous souhaitez traquer de véritables fuites de mémoire, vous devez utiliser les outils FastMM. Téléchargez la version complète de FastMM depuis SourceForge et lisez la documentation pour savoir comment activer le FullDebugMode et le reporting et l'enregistrement des fuites, vous aurez alors beaucoup plus facile.

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