Zuweisung von mehr als 1.000 MB Speicher im 32-Bit-.NET-Prozess
Frage ich mich, warum bin ich nicht in der Lage, die Zuweisung von mehr, dass 1.000 MB Speicher in meinem 32-bit .NET-Prozess. Die folgende mini-Anwendung löst eine OutOfMemoryException, nachdem er zugeordnet 1.000 MB. Warum 1000 MB, und nicht sagen, 1,8 GB? Gibt es eine Prozess-weiten-Einstellung, die ich ändern könnte?
static void Main(string[] args)
{
ArrayList list = new ArrayList();
int i = 0;
while (true)
{
list.Add(new byte[1024 * 1024 * 10]); //10 MB
i += 10;
Console.WriteLine(i);
}
}
PS: Müll sammeln, hilft nicht.
Bearbeiten, um zu klären, was ich will: ich geschrieben habe eine server-Applikation, die sich mit sehr großen Mengen von Daten vor dem schreiben auf die Datenbank/Festplatte. Anstelle der Schaffung von temporären Dateien für alles, was, die ich geschrieben habe, eine in-memory-cache, das macht die ganze Sache super-schnell. Aber der Speicher ist begrenzt, und so habe ich versucht, herauszufinden, was die Grenzen sind. Und gewundert, warum meine kleine test-Programm warf die OutOfMemoryException nach genau 1.000 MB.
InformationsquelleAutor der Frage Stefan Schultze | 2009-07-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den virtuellen Adressraum limit für ein Win32-Prozess ist 1,5 GB (nicht ganz richtig). Zusätzlich in der .NET frameworks gibt es einen limiter, um die % des Speichers ein .NET-Prozess verbraucht werden kann. Die Maschine ist.config ist ein processModel-element mit einem Attribut die memoryLimit-Einstellung, die die % des verfügbaren Arbeitsspeichers, den ein Prozess verbrauchen kann. Der Standard-Wert beträgt 60%.
Wenn der Computer Sie ausgeführt hat 2 GB Speicher, oder Sie noch nicht aktiviert Sie die /3GB wechseln Sie in Ihr BOOT.INI dann wirst du um ~1,3 GB Speicher pro Prozess.
Ich kann nicht finden, den KB-Artikel, aber wenn ich mich richtig erinnere .NET 1.x-Adresse nicht über die 1,5 GB (1,8 GB?) limit-unabhängig von Ihren Einstellungen.
http://blogs.msdn.com/tmarq/archive/2007/06/25/some-history-on-the-asp-net-cache-memory-limits.aspx
http://social.msdn.microsoft.com/Forums/en-US/clr/thread/c50ea343-b41b-467d-a457-c5a735e4dfff
http://www.guidanceshare.com/wiki/ASP.NET_1.1_Performance_Guidelines_-_Caching#Configure_the_Memory_Limit
InformationsquelleAutor der Antwort MyItchyChin
Dass die riesigen Blöcke der Speicher ist nie eine gute Idee, auch in 64bit. Erhalten Sie große Probleme mit zusammenhängenden Speicher und Fragmentierung.
Das problem hier ist die Suche nach einem zusammenhängenden block. Sie könnten versuchen, die Aktivierung 3gb-Modus (das könnte helfen, es zu finden ein paar bytes mehr), aber ich wirklich abraten. Die Antworten hier sind:
Vielleicht wollen Sie auch zu Lesen Eric Lippert ' s blog (scheint er zu haben, einen blog-Eintrag für jedes gemeinsam .Die NETTO-Frage...)
InformationsquelleAutor der Antwort Marc Gravell
Ich habe vor kurzem das tun, umfangreiche profiling-um das Gedächtnis in Grenzen .NET auf einem 32bit Prozess. Wir alle bombardiert mit der Idee, dass wir zuordnen können bis zu 2,4 GB (2^31) in einem .NET-Anwendung, aber das ist leider nicht wahr :(. Die Anwendung Prozess, der viel Platz zu verwenden, und das Betriebssystem hat eine große Aufgabe der Verwaltung ist es für uns, jedoch .NETZ selbst scheint seine eigene overhead die etwa 600-800 MB für typische real-world-Anwendungen, push-das memory limit. Dies bedeutet, dass, sobald Sie reservieren ein array von Ganzzahlen, das ungefähr 1,4 GB ist, sollten Sie erwarten, um zu sehen, eine OutOfMemoryException().
Natürlich in 64bit, diese Grenze tritt übrigens später (lassen Sie s-chat in 5 Jahren :)), aber die Allgemeine Größe des Arbeitsspeichers, der wächst auch (ich finde es ist ~1,7 ~2 mal), denn das erhöht die word-Größe.
Was ich sicher weiß ist, dass der Virtuelle Speicher Ahnung von dem Betriebssystem definitiv NICHT geben Ihnen nahezu endlose Zuordnung Raum innerhalb eines Prozesses. Es ist nur so, dass die vollen 2,4 GB adressierbar ist, um alle (viele) Anwendungen gleichzeitig ausführen.
Ich hoffe, dieser Einblick hilft ein wenig.
Ich ursprünglich antwortete, etwas hier (ich bin noch ein newby bin also nicht sicher, wie soll ich diese links):
Ist es ein memory-limit für eine einzelne .NET-Prozess
InformationsquelleAutor der Antwort Luke Machowski
Nehmen Sie VIEL MEHR Speicher als ~2 GB, indem Sie Ihre Anwendung auf einem 64-bit-Architektur, was bedeutet, dass Sie erstellen eine neue build-Konfiguration in Visual Studio und build der Anwendung läuft nur auf 64-bit-Versionen von Windows. In .NET, verwenden Sie die Standardeinstellung "Any CPU" build-option für Ihre Anwendung ist, finde ich, dass ich nur zuweisen konnte über 1.5 GB Speicher aus dem heap (auch auf 64-bit-Windows-Maschine), das ist, weil die Anwendung läuft nur im 32-bit Modus, wenn es gebaut ist in "Any CPU" - Modus. Aber von der Zusammenstellung auf der x64-Architektur, die Sie zuordnen können viel, viel mehr Speicher vom heap, der während der Ausführung der Anwendung, und ich werde erklären, wie man erstellen Sie eine x64-build für Ihre Anwendung unter:
Wieder mit der normalen (default) "Jede CPU" build-option in Ihrem .NET-Projekt, wird die Anwendung IMMER laufen unter 32-bit-Modus, auch auf einem 64-bit-Windows-Betriebssystem. Daher werden Sie nicht in der Lage sein, die Zuweisung von mehr als etwa 1,5 bis 2 GB RAM-Speicher während der Ausführung der Anwendung. Führen Sie Ihre .NET-Anwendung, die in echten 64-bit-Modus, müssen Sie gehen in die build-Konfigurations-manager, und erstellen Sie einen build geben Sie für die x64-Architektur und anschließend neu kompilieren Sie Ihr Programm für x64 explizit mit diesem build geben. Der x64-build-Modus-option erstellt werden können, für Ihre .NET-Lösung mit den folgenden Schritten:
Verwendung eines 64-bit-build der Anwendung auf einem 64-bit-Windows-Betriebssystem erlauben, Ihr Programm zuordnen, viel mehr als ~2GB RAM, vermutlich bis zu 2^64 address spaces (wenn man den RAM und Festplattenspeicher zur Verfügung, welche sind die wahren begrenzenden Faktoren wie der Zeitpunkt des Schreibens dieser Antwort).
Wenn du bist immer NOCH der Speicher in Ihrer Anwendung, Sie können auch erhöhen Sie die Größe der Windows-Auslagerungsdatei. Auf Windows, die Auslagerungsdatei ermöglicht es, das Betriebssystem zu verlagern Speicher aus dem RAM auf die Festplatte, wenn es nicht genügend RAM-Speicher. Aber es ist eine große Zeit-Kosten bei der Verlagerung Abschnitte der RAM-Speicher und von der Festplatte, so kann es ein echter hit auf die performance der Anwendung. Unabhängig von der Leistung, durch die Erhöhung der Größe der Seite, könnte man (in der Theorie) die Seite machen die Datei so groß wie der verfügbare freie Speicherplatz auf dem C: - Laufwerk Ihres windows-Rechners. In diesem Fall, Ihre Anwendung würde zuordnen können, zum Beispiel, bis zu 4 TB Speicher (oder was auch immer die Speichergröße, die Ihr die Größe der Auslagerungsdatei festgelegt ist) während der Ausführung des Programms. Ändern Sie die Seite file die Einstellungen für Ihre Windows-Maschine führen Sie die folgenden:
Ich hoffe jedenfalls, dies hilft den Menschen verstehen, warum Sie laufen können, in dieser 1.5 - 2 GB Speicher-Beschränkung Ausgabe .NET-Anwendung, selbst wenn Sie auf einem 64-bit-Windows-Maschine. Dies kann eine sehr verwirrende Problem für die Menschen, und ich hoffe meine Erklärung macht Sinn. Bitte fühlen Sie sich frei, um Nachricht mich mit Fragen zu dieser Antwort, wenn nötig.
InformationsquelleAutor der Antwort GeoffreyG
Ich denke, das Problem hier ist, dass diese Anwendung wird das hinzufügen von 10MB bei jedem loop macht es, und die Schleife: "while(true)" das heißt, es wird das hinzufügen dieser 10MBs, bis die Anwendung beendet wird. Also, wenn Sie zu laufen waren für die 100-Schleife, es würde Hinzugefügt haben, in der Nähe 1GBs zu rammen, und ich gehe davon aus, dass Sie es getan haben würde, dies in weniger als 30 Sekunden. Mein Punkt ist, dass Sie versuchen, zu 10 megabyte Speicher pro loop, in einer nie endenden Schleife
InformationsquelleAutor der Antwort ntwana
Ich bin wirklich Leid wenn ich nicht deinen Punkt, aber:
Haben Sie versucht, die mit der Methode? Und das mag eine dumme Frage, aber warum hast du eine ewige Schleife? O, wenn Sie versuchen, den code-Streifen der Symbole >.> xD.
Quelle: http://msdn.microsoft.com/en-us/library/yh598w02(v=vs. 80).aspx
InformationsquelleAutor der Antwort Nico