Erhalten Sie gelegentlich OutOfMemory-Ausnahmen von einer ausgelasteten .NET-Anwendung
Die Antwort darauf ist zu komplex, um in eine Antwort zu passen. Eine vollständige Beschreibung des Themas finden Sie unter " Optimieren der Leistung von .NET-Anwendungen " .
Hier ist eine stark vereinfachte (aber immer noch recht gute) Zusammenfassung von Bruno Jouhier :
Darüber hinaus können Sie mit der .NET-Laufzeit nicht bis zu 2 GB erreichen. Der Garbage Collector kopiert lebende Objekte und benötigt daher ausreichend Platz, um seine Kopien auszuführen.
Bearbeiten:
Hier ist mein Erklärungsversuch ...
Wenn Sie sich fragen, wie groß der maximale Arbeitsspeicher des Arbeitsprozesses (wie vom Task-Manager angegeben) für einen ASP.NET-Arbeitsprozess unter x86 ist, lautet die Antwort "es hängt davon ab" .
In jeder Art von verwaltetem Code wie Java oder .NET gibt der Programmierer die fein abgestimmte Kontrolle des Speichers auf, um nicht mit Zeigern umgehen zu müssen. Während ein Programm ausgeführt wird, werden Heap und Stack regelmäßig vom Garbage Collector bereinigt .
Insbesondere in Bezug auf ASP.NET wird der Garbage Collector im selben Arbeitsprozess wie die Website ausgeführt. Der GC verbraucht eigenen Speicher. Wie viel Speicher hängt ganz davon ab, wie der Code Ihrer Anwendung geschrieben wird. Eine App kann möglicherweise 1,8 GB Speicher verwenden, während eine andere bei 500 MB erstickt. Um zu verstehen, warum , müssen Sie Ihre spezifische Anwendung profilieren.
Jeder Prozess unter einem x86-Windows-Betriebssystem ist auf 2 GB beschränkt, es sei denn, Sie haben den Schalter / 3 GB in Ihrer Datei boot.ini festgelegt. In diesem Fall kann ein Prozess 3 GB verwenden.
quelle
Aus diesem Blog-Beitrag "Empfehlungen für die Einstellungen des SharePoint-Anwendungspools" :
Nach meiner Erfahrung ist 800 MB die Schwelle für 32-Bit-Maschinen (2-4 GB RAM). Es recycelt App-Pools, bevor Ausnahmen "aus dem Speicher" ausgelöst werden.
quelle
Stellen Sie sicher, dass Sie die Größe des virtuellen Speichers in Ihrem App-Pool nicht festlegen. Wenn Sie diesen Wert auf eine Zahl außerhalb des zulässigen Bereichs einstellen, wird er auf 512 MB zurückgesetzt. Siehe KB923197 .
Beachten Sie außerdem, dass ASP.Net den Pool bei Ausführung einer ASP.Net-Anwendung mit 60% des 2-GB-Speicherlimits oder 1,2 GB recycelt. Dies ist nicht Ihr ~ 500-Szenario, aber bei 32-Bit-Apppools mit großer Speichernutzung wird dies manchmal über Wochen durchgeführt, um etwas mehr Speicher zu erhalten.
quelle
Unter Windows 2003 können Sie die PAE ( Physical Allocation Extension ) so einstellen , dass der gesamte Speicher verwendet wird. Der Standardspeicher für einen IIS6-Apppool beträgt 5 MB .
quelle