19. marts 2004 - 10:47Der 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)
"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å ?
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;
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.
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.
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.