Libération de la mémoire

Résolu
cs_Gerard Messages postés 121 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 7 août 2018 - 17 sept. 2011 à 09:28
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...

5 réponses

Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
17 sept. 2011 à 20:02
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é.
3
cs_Gerard Messages postés 121 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 7 août 2018
17 sept. 2011 à 20:12
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...
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
9 oct. 2011 à 17:14
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;
0
cs_Gerard Messages postés 121 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 7 août 2018
9 oct. 2011 à 19:13
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!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
18 oct. 2011 à 16:22
0
Rejoignez-nous