Programmgröße im Speicher
-
Hallo,
ich möchte gern wissen, wie viel Platz mein eigenes Programm im Speicher verbraucht. Wenn möglich ohne Einbindung von Fremdkomponenten, Bibliotheken und dergleichen.
Über eine schnelle Lösung, ohne pädagogische Einwürfe wäre ich sehr dankbar.

-
Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Was denn nun?
- Nur die EXE ohne Daten?
- Wenn es auch um die Daten geht, die Deine Anwednung verwendet, kannst Du zwischen allokiertem Speicher Fremdbibliotheken, anderer DLLs und Deinem Code nicht unterscheiden.Auf die schnelle bekommt man einen Einblick, wenn Du dich mal mit GetProcessMemoryInfo auseinandersetzt und den geladenen Modulen in Deinem Prozess.
Ansonsten schau Dir das Sample VMMAP.EXE von Jeffrey Richter aus "Advanced Windows" an da kannst Du einiges abgucken, wenn es mehr ins Detail gehen soll.
-
ich glaube er meinte nur den Speicher den sein eigenes Programm verbraucht. Und um den herauszufinden, möchte er keine Fremdbibliotheken benutzen müssen. Mit GetProcessMemoryInfo sollte ihm also geholfen sein als Windows Bordmittel.
greetz KN4CK3R
-
Jup, ihr habt recht. Da ich in C++ noch nicht so firm bin, dauert das etwas. Aber die Richtung stimmt schonmal. Werde ich mir dann morgen mal anschauen. Ich will halt wissen wie viel Speicherplatz das Programm im Ram braucht.

-
Der Taskmanager tut nicht was du willst?
-
Naja, ich will es ja aus meinem Programm heraus machen. Wie sollte der TM mir da helfen, kann man den das Fragen?
-
Hallo,
Hier ein Beispielcode:
PROCESS_MEMORY_COUNTERS pmc; HANDLE hProcess; DWORD processID; processID = GetCurrentProcessId(); hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, processID); GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc)); CloseHandle(hProcess);Die Größe deines Programms im RAM ist dann in pmc.WorkingSetSize gespeichert.
MfG, Jochen
-
Wobei sich die Working-Set-Size dauernd ändert, wird dynamisch angepasst danach wieviel des angeforderten/zugeteilten (virtuellen) Speichers das Programm gerade aktiv verwendet, und natürlich danach wie viel Speicher andere Programme gerade brauchen.
Das entspricht zwar genau der Fragestellung von freak4fun, weiss aber nicht ob es auch das ist was er rausbekommen will

-
Werte "PrivateBytes" aus... (oder auch PageFileUsage genannt).
-
Hallo,
ich danke euch allen erstmal für die rege Beteiligung.
Ich habe nun folgendes:
PROCESS_MEMORY_COUNTERS pmc; GetProcessMemoryInfo( this->Handle, &pmc, sizeof( pmc)); int* Bytes; ULongToInt( pmc.WorkingSetSize, Bytes); ShowMessage( IntToStr( *Bytes));Ich habe hier den C++-Builder 2010. Das Handle entspricht dem HANDLE hProcess. Da die Werte auch die gleichen sind (beim debuggen verglichen), denke ich das geht so ok. Allerdings bekomme ich eine Exception bei:
GetProcessMemoryInfo( this->Handle, &pmc, sizeof( pmc));---------------------------
Project1
---------------------------
Zugriffsverletzung bei Adresse 7551AA67 in Modul 'KERNELBASE.dll'. Schreiben von Adresse 00000028.
---------------------------
OK
---------------------------Was mache ich falsch?

Ich habe für die psapi.dll eine psapi.lib erstellt und die psapi.h, psapi.dll und psapi.lib in mein Projekt eingebunden.
-
Du hast dem Zeiger Byte keine gültige Adresse zugewiesen, er ist also undefiniert. Greifst du nun über diesen Zeiger auf den Speicher zu, führt das zu einem Fehler. Hier noch zwei verbesserte Versionen:
Version 1:
PROCESS_MEMORY_COUNTERS pmc; GetProcessMemoryInfo( this->Handle, &pmc, sizeof( pmc)); int* Bytes = new int; ULongToInt( pmc.WorkingSetSize, Bytes); ShowMessage( IntToStr( *Bytes)); delete Bytes; Bytes = NULL;Version 2:
PROCESS_MEMORY_COUNTERS pmc; GetProcessMemoryInfo( this->Handle, &pmc, sizeof( pmc)); int Bytes; ULongToInt( pmc.WorkingSetSize, &Bytes); ShowMessage( IntToStr( Bytes));Ich würde allerdings die 2. Version vorziehen, da sie meiner Meinung nach weniger fehleranfällig ist.
MfG, Jochen
-
Die 2. Version ist klasse.

Ich bekomme als Ergebnis:
[Window Title]
Project1[Content]
2005905114[OK]
Der Taskmanager zeigt an im Gegensatz 2.616 [KB] zu meinen 2.005 [KB] an. Wie kommt das nun schon wieder? Etwas geht für das ShowMessage (2.308 [KB]) drauf, aber der Rest?
-
Hallo,
Versuch mal, den Wert PagefileUsage anstatt workingSetSize auszuwerten:
PROCESS_MEMORY_COUNTERS pmc; GetProcessMemoryInfo( this->Handle, &pmc, sizeof( pmc)); int Bytes; ULongToInt( pmc.PagefileUsage, &Bytes); ShowMessage( IntToStr( Bytes));Das wäre dann das, was Jochen Kalmbach vorgeschlagen hat.
MfG, Jochen
-
PagefileUsage und WorkingSetSize liefern mir das gleiche Ergebnis.

-
Zufall... minimiere mal Deine Anwendung und lese die Werte dann nochmals aus

-
Jochen Kalmbach schrieb:
Zufall... minimiere mal Deine Anwendung und lese die Werte dann nochmals aus

Ich habe ein Leeres Projekt mit Button. Da ist net viel zu minimieren.

Ich werd mir das aber weiter anschauen und testen.