Frage zu Speicherverbrauch einer Anwendung
-
Hallo!
Wieviel Speicher kann eine Anwendung unter Windows 32Bit maximal verwenden? Ich habe aus diversen Quellen unterschiedliche Angaben bezogen, die sich zwischen 2 und 3 GByte bewegen. Weiß da jemand genaueres?
Außerdem benutze ich die Funktion GetProcessMemoryInfo um für meinen aktuellen Prozess den Speicherstatus zu ermitteln. Welche der Werte in dieser Struktur spiegeln eigentlich den _gesamten_ Verbrauch des Programms wieder? Also ausgelagert + nicht ausgelagert?
Ich möchte vor einer speicher- und zeitintensiven Berechnung abprüfen, ob noch genügend Speicher zur Verfügung steht um die Berechnung zu starten.
Danke für die Hilfe
-
Ohne am System was zu verändern, kann ein Prozess unter 32-Bit-Windows maximal 2 GB verbraten. Man kann dies aber mit einer Änderung in der boot.ini (siehe Google) auf 3 GB hochschrauben.
EDIT: Unter 64-Bit-Windows kann ein 32-Bit-Prozess übrigens 4 GB nutzen, wenn in der exe das LAA-Flag (large address aware flag) gesetzt ist.
-
Ja. Entweder 2 GB oder 3 GB (nur, wenn die Applikation mit LARGE_ADDRESS_AWARE markiert wurde!).
Das heisst aber noch lange nicht, dass Du auch so viel SPeicher an einem Stück allokieren kannst!
Siehe auch:
http://blog.kalmbachnet.de/?postid=9Das für Dich relevante aus GetProcessMemoryInfo ist "privateBytes".
-
Danke für die Infos.
Unter 64-Bit-Windows kann ein 32-Bit-Prozess übrigens 4 GB nutzen, wenn in der exe das LAA-Flag (large address aware flag) gesetzt ist.
Gibts da auch eine Möglichkeit das zur Laufzeit zu ermitteln? Problem ist nämlich, dass mein Programm eigentlich nur ein Plugin in einem anderen Programm ist.
Da stellt sich für mich natürlich die Frage, wie sich das dann verhält wenn ich meine DLLs mit LAA builde, das Host-Programm das aber nicht kann...Das für Dich relevante aus GetProcessMemoryInfo ist "privateBytes".
Meinst du damit PrivateUsage aus PROCESS_MEMORY_COUNTERS_EX?
-
1. Es ist richtig, normalerweise sind es 2GB, der Anwendung können jedoch auch 3GB zur Verfügung stehen (vgl. auch http://www.c-plusplus.net/forum/viewtopic-var-t-is-274459.html).
Wo sich die Daten der eigenen App befinden, also ob im physischen RAM oder ausgelagert auf Disk, kann eine Anwendung auf Ring 3 -Ebene nicht herausfinden, dafür ist einzig und allein der Memory-Manager von Windows verantwortlich.
Ob noch genügend (Arbeits-) Speicher dem kompletten System Verfügung steht, kannst du mit GlobalMemoryStatus / GlobalMemoryStatusEx herausfinden (http://msdn.microsoft.com/en-us/library/aa366589%28VS.85%29.aspx).
-
Das LAA bezieht sich *nur* auf EXE! Die DLL spielt dabei keinerlei Rolle!
Siehe auch:
http://blogs.msdn.com/b/oldnewthing/archive/2010/09/22/10065933.aspx
-
Danke an alle für die Hilfe. Ich mach jetzt eine Kombination aus
GetProcessMemoryInfo
und
GlobalMemoryStatusEx
Das passt für meine Zwecke.