Ich erhalte in meiner c # -Anwendung eine Ausnahme wegen Speichermangel, wenn die Speichernutzung für die Anwendung etwa 1,3 GB überschreitet.
Ich hatte das gleiche Problem auf einem 32-Bit-Computer mit 3 GB Speicher und es war damals sinnvoll, aber jetzt habe ich die Hardware auf einen 64-Bit-Computer mit 16 GB Speicher mit High-End-Motherboard und RAM, aber nicht genügend Speicher aktualisiert Ausnahme tritt immer noch nach 1,3 GB auf!
Ich weiß, dass es keine einzelnen Objekte über 2 GB gibt und 1,3 ohnehin weniger als 2 GB, so dass die eingebaute MS 2 GB-Grenze für ein einzelnes Objekt wahrscheinlich nicht das Problem ist ...
Es scheint, als gäbe es einen Windows-Kill-Switch, wenn eine App einen bestimmten Schwellenwert für die Speichernutzung erreicht ... Dann sollte es vielleicht eine Möglichkeit geben, dies in der Registrierung zu konfigurieren.
Jede Hilfe wird sehr geschätzt!
quelle
Antworten:
Es gibt keinen Unterschied, bis Sie mit derselben Zielarchitektur kompilieren . Ich nehme an, Sie kompilieren
32
in beiden Fällen für die Bit-Architektur.Es ist erwähnenswert, dass
OutOfMemoryException
dies auch ausgelöst werden kann, wenn Sie2GB
Speicher erhalten, der von einer einzelnen Sammlung in CLR (z. B.List<T>
) sowohl auf Architekturen32
als auch auf64
Bit zugewiesen wird .Um von der Speichergüte der Bitarchitektur profitieren zu können
64
, müssen Sie Ihre Code-Targeting- Bitarchitektur kompilieren64
. Danach läuft Ihre Binärdatei natürlich nur noch auf64
Bit, profitiert jedoch von der Möglichkeit, dass mehr Speicherplatz im RAM verfügbar ist.quelle
Wie bereits erwähnt, steht Ihnen beim Kompilieren der App in x64 viel mehr Speicher zur Verfügung.
Für den Fall, dass eine App in x86 erstellt werden muss, gibt es eine Möglichkeit, das Speicherlimit von 1,2 GB auf 4 GB zu erhöhen (dies ist das tatsächliche Limit für 32-Bit-Prozesse):
Im VC / bin-Ordner des Visual Studio-Installationsverzeichnisses muss sich eine
editbin.exe
Datei befinden. In meiner Standardinstallation finde ich es also unterDamit das Programm funktioniert, müssen Sie es möglicherweise zuerst
vcvars32.bat
im selben Verzeichnis ausführen . Dann eineditbin /LARGEADDRESSAWARE <your compiled exe file>
reicht aus, um Ihr Programm 4 GB RAM verwenden zu lassen.
<your compiled exe file>
ist die exe, die VS beim Kompilieren Ihres Projekts generiert hat.Wenn Sie dieses Verhalten jedes Mal automatisieren möchten, wenn Sie Ihr Projekt kompilieren, verwenden Sie das folgende Post-Build-Ereignis für das ausgeführte Projekt:
Nebenbemerkung: Dasselbe kann mit dem gemacht werden
devenv.exe
, damit Visual Studio auch 4 GB RAM anstelle von 1,2 GB verwendet (aber zuerst das alte sicherndevenv.exe
).quelle
Erwähnenswert ist, dass die Standardeinstellung für eine Kompilierung "Beliebige CPU" jetzt das Kontrollkästchen "32-Bit bevorzugen" aktiviert. Wenn auf AnyCPU eingestellt ist, kann auf einem 64-Bit-Betriebssystem mit 16 GB RAM bei 2 GB immer noch eine Ausnahme wegen Speichermangel auftreten, wenn dies aktiviert ist.
quelle
Es sieht so aus, als hätten Sie einen 64-Bit-Bogen, aber eine 32-Bit-Version der .NET-Laufzeit und / oder eine 32-Bit-Version von Windows.
Daher ist der für Ihren Prozess verfügbare Adressraum immer noch derselbe. Er hat sich gegenüber dem vorherigen Setup nicht geändert.
Upgrade auf ein 64-Bit-Betriebssystem und eine 64-Bit-.NET-Version;)
quelle
Läuft Ihre Anwendung als 64- oder 32-Bit-Prozess? Sie können dies im Task-Manager überprüfen.
Es könnte sein, dass es mit 32 Bit läuft, obwohl das gesamte System mit 64 Bit läuft.
Bei 32 Bit kann dies durch eine Bibliothek eines Drittanbieters verursacht werden. Stellen Sie jedoch zunächst sicher, dass Ihre Anwendung für "Beliebige CPU" kompiliert wird, wie in den Kommentaren angegeben.
quelle
Wenn Sie 32-Bit-Windows haben, funktioniert diese Methode nicht ohne die folgenden Einstellungen.
Wir haben diese Einstellungen hinzugefügt und dieser Block gestartet.
Weitere Informationen - Befehl
increaseuserva
: https://docs.microsoft.com/en-us/windows-hardware/drivers/devtest/bcdedit--setquelle