Avatar billede laffe Nybegynder
19. marts 2004 - 10:47 Der er 7 kommentarer og
1 løsning

API kald til brugt hukommelse af en process.

Er der nogen der kender et API-kald til at få en oversigt af brugt hukommelse af en given proicess. Det tal jeg gerne vil have fat i er "Private bytes" under performance monitoren (Windows 2000)
Avatar billede bertelbrander Novice
19. marts 2004 - 21:00 #1
Måske GetProcessMemoryInfo(), se:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/perfmon/base/collecting_memory_usage_information_for_a_process.asp

Jeg tror dog ikke at du kan se "private bytes" (som jeg ikke ved hvad er).
Avatar billede laffe Nybegynder
24. marts 2004 - 12:36 #2
Hej BertelBrender

Tak for dit link.

"Private bytes" er en counter man kan vælge i Windows Performance applikationen. Private Bytes skulle vise de antal bytes en application allokerer.

GetProcessMemoryInfo har jeg prøvet, men den viser tilsyneladende ikke de rigtige vædier.

Mit problem består i at jeg har en applikation som jeg mener har et memory leak (fordi private bytes i performance manageren stiger). Så jeg har lagt logninger i min kode, for hver gang jeg allokerer noget hukommelse. Men mine logninger kommer ikke - altså konkluderer jeg at det ikke er min kode der allokerer hukommelse, men hvem/hvad gør det så ?
Avatar billede laffe Nybegynder
24. marts 2004 - 12:36 #3
Hovsa ikke BertelBrender men BertelBrander ;)
Avatar billede bertelbrander Novice
24. marts 2004 - 23:10 #4
Måske er det denne du leder efter:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnperfmo/html/perfmon.asp

Hvad er det for en applikation? Måske er det hukommelse der bliver allokeret indirekte, f.ex. tråde du laver, ...

Hvilken kompiler bruger du?
Avatar billede laffe Nybegynder
25. marts 2004 - 08:42 #5
Hej BertelBrander

Jeh bruger Compiler CBuilder 5.0

Jeg har en stor applikation med:
- flere omkring 1000 tråde.
- et database interface (mySQL).
- et interface til noget hardware.

Når min application kører har jeg opdaget (via Performance Monitor) af der bliver brugt Memory, selvom det ikke er min kode der allokerer noget. Da jeg så begyndte at debugge min kode for at finde leak'et var det helt umuligt at finde frem til hvor præcis leaket var. Det så meget tilfældig ud, hvornår der blev allokeret hukommelse, og hvor meget. Så jeg besluttede mig for at lave en meget simpel application der allokerer hukommelse. Jeg lavede en TMemClass, som fylder 1 Mb. Så har jeg brugt GlobalMemoryStatus for at skrive hukommelsesforbruget ud. Når jeg så kører programmet, så vil jeg jo mene at memory forbruget for application skulle vokse med 1 mb for hver gang jeg allokerer en TMemClass, men det gør den ikke !


Det kan da ikke passe at man ikke kan finde ud af hvor meget hukommelse en applikation har brugt på et givet tidspunkt.

class TMemClass
{
  char Buffer[1024*1024];
public:
  __fastcall TMemClass();
  __fastcall ~TMemClass();

};

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  long APh,APa,AVi;
  TMemClass *C;
  MEMORYSTATUS MS;
  GlobalMemoryStatus(&MS);
  APh = MS.dwAvailPhys;
  APa = MS.dwAvailPageFile;
  AVi = MS.dwAvailVirtual;
  C = new TMemClass();

  GlobalMemoryStatus(&MS);
  APh = APh - MS.dwAvailPhys;
  APa = APa - MS.dwAvailPageFile;
  AVi = AVi - MS.dwAvailVirtual;

  Memo1->Lines->Add(IntToStr(APh)+ "  "+IntToStr(APa)+ "  "+IntToStr(AVi)+ "  "+IntToStr(sizeof(TMemClass)));
}
Avatar billede bertelbrander Novice
26. marts 2004 - 00:30 #6
Hukommelses forbrug på Windows er mærkelig...

Jeg lavede følgende lille program:

#include <windows.h>
#include <psapi.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  void *p;

  PROCESS_MEMORY_COUNTERS ProcessMemoryCounters;
  HANDLE ProcessHandle = GetCurrentProcess();
  GetProcessMemoryInfo(ProcessHandle, &ProcessMemoryCounters, sizeof(ProcessMemoryCounters));
  printf("WorkingSetSize:        %10d\n", ProcessMemoryCounters.WorkingSetSize);
  p = malloc(1024*1024*8);
  GetProcessMemoryInfo(ProcessHandle, &ProcessMemoryCounters, sizeof(ProcessMemoryCounters));
  printf("WorkingSetSize:        %10d\n", ProcessMemoryCounters.WorkingSetSize);
  memset(p, 0, 1024*1024*8);
  GetProcessMemoryInfo(ProcessHandle, &ProcessMemoryCounters, sizeof(ProcessMemoryCounters));
  printf("WorkingSetSize:        %10d\n", ProcessMemoryCounters.WorkingSetSize);
  free(p);
  GetProcessMemoryInfo(ProcessHandle, &ProcessMemoryCounters, sizeof(ProcessMemoryCounters));
  printf("WorkingSetSize:        %10d\n", ProcessMemoryCounters.WorkingSetSize);
  return 0;
}

Output er som følger:
WorkingSetSize:            684032
WorkingSetSize:            692224
WorkingSetSize:          9101312
WorkingSetSize:            696320

Det kan bemærkes at:
1: Den hukommelse der bliver allokeret med malloc bliver i virkeligheden ikke allokeret før den bliver brugt (af memset).
2: Mængden af hukommelse synes at stige, selv om den hukommelse der bliver allokeret bliver frigivet.

I dit test program bliver hukommelsen ikke brugt, prøv at indsætte en memset i constructoren for din TMemClass

Har du prøvet at bruge Builderens CodeGuard? Den gør programmet meget langsommere, men er ret god til at finde memory og andre resource leaks.
Avatar billede laffe Nybegynder
18. juli 2004 - 19:52 #7
Hej bertelbrander

Undskyld den lange "svartid", men jeg opgav at finde ud af windows'es memory håndtering. Det vil for altid være mig en gåde hvordan det skidt virker - men ellers tak for sparingen :-)


PS: Har brugt Codeguard til den store guld medalie, men har måtte konstatere at den ikke finder alt.
Avatar billede laffe Nybegynder
18. juli 2004 - 19:53 #8
jeg lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester