Libération de la mémoire [Résolu]

Messages postés
123
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
7 août 2018
- - Dernière réponse : Caribensila
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
- 18 oct. 2011 à 16:22
Bonjour,

J'ai une petite application (O,5 Mo)qui lance de façon planifiée d'autres applications au travers de l'API shellexecute.
Cela fait monter la taille de la mémoire de cette appli à 4,3 Mo et elle ne redescend pas même lorsque l'application appelée se termine et se ferme.
Cela n'est pas vraiment gênant mais curieux de nature, j'aimerai bien comprendre ce qui se passe!

D'autant plus que j'ai une autre appli (un serveur) qui gonfle au cours de la journée...
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
3
Merci
Bonjour,

Ta question est légitime, mais rassure-toi !
La mémoire est bien libérée mais le gestionnaire des tâches Windows n'en rend pas compte.

En fait (si j'ai bien compris et que je me souviens bien), la mémoire libérée par ton application (par un free, par exemple) est mise à la disposition de tous les process qui en auraient besoin; mais tant qu'aucun process ne demande cette mémoire, elle reste quand même à la disposition de ton application.
Le gestionnaire des tâches Windows n'en tiendra compte qu'à l'instant où un autre process utilisera cet espace mémoire.
Ceci est possible car le système virtualise la gestion de la mémoire et les adresses mémoire que nous utilisons (les pointeurs) ne correspondent pas à des adresses physique de la RAM.

Voilà. J'espère avoir un peu répondu à ta curiosité.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 194 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Caribensila
Messages postés
123
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
7 août 2018
0
Merci
Merci de ta réponse.

Bon, je vais arrêter de surveiller trop ce point! lol

Toutefois je ne comprends pas que des shellExecute fasse gonfler à ce point la mémoire du programme qui les invoque... même si elle reste disponible!

Enfin bon c'est Windows...
Commenter la réponse de cs_Gerard
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
9
0
Merci
Bonjour,

Désolé pour la réponse tardive.

Comme son nom l'indique, ShellExecute est une fonction du shell donc elle est plus ou moins lié au shell -> "explorateur Windows". Donc elle est liée à une usine à gaz et ça a une influence sur ses performances. Ca risque notamment de charger des dlls qui vont occuper de la mémoire sans être utilisées par la suite.

Pour lancer un bête processus, il est donc préférable de passer par CreateProcess. Elle est un peu plus compliqué à utiliser mais elle est plus légère à l'exécution (ShellExecuteA appelle CreateProcessW en interne).

Je dis pas que ça corrigerait ton problème, mais ça peut difficilement le faire empirer.

procedure ShellExecuteWrapper(lpExe: String; lpParameters: String);
begin
  if ShellExecute(0, nil, PChar(lpExe), PChar(lpParameters), nil, SW_SHOW) <= 32 then
  begin
    ShowMessage('Failed to launch "' + lpExe + '".');
  end;
end;

procedure CreateProcessWrapper(lpExe: String; lpParameters: String);
var
  startupInfo: TStartupInfo;
  processInfo: TProcessInformation;
begin
  ZeroMemory(@startupInfo, SizeOf(startupInfo));
  with startupInfo do
  begin
    cb:= SizeOf(startupInfo);
    dwFlags:= STARTF_USESHOWWINDOW;
    wShowWindow:= SW_SHOW;
  end;
  if not CreateProcess(nil, PChar(lpExe + ' ' + lpParameters), nil, nil, False, 0, nil, nil, startupInfo, processInfo) then
    RaiseLastOSError
  else
  begin
    CloseHandle(processInfo.hProcess);
    CloseHandle(processInfo.hThread);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  nBeginning: Cardinal;
  nEnd: Cardinal;
begin
  nBeginning:= GetTickCount;
  CreateProcessWrapper('notepad.exe', 'toto.txt');
  ShowMessage(IntToStr(GetTickCount - nBeginning));

  nBeginning:= GetTickCount;
  ShellExecuteWrapper('notepad.exe', 'toto.txt');
  ShowMessage(IntToStr(GetTickCount - nBeginning));
end;
Commenter la réponse de cs_rt15
Messages postés
123
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
7 août 2018
0
Merci
Oui, je viens de faire l'essai et effectivement, l'impact sur l'occupation de la mémoire est visible.
Le programme qui me sert de support est le suivant: en plus d'un tas d'autres choses, il active un chien de garde qui essaie de se connecter à un serveur qui tourne sur la machine en question. Si la connexion échoue, alors le chien de garde reboote l'ordinateur, ce qui redémare le serveur.
Le programme qui occupe 1,8Go normalement, en occupe 4,6 après avoir activé le Chien de garde (bien que celui-ci se referme si pas de problème).
Avec CreateProcess, plus d'inflation de la mémoire...

Merci du tuyau!
Commenter la réponse de cs_Gerard
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
Commenter la réponse de Caribensila