3 Stimmen

Wird die GAC eine ASP.NET/IIS6.0 System.OutOfMemoryException beheben?

Ich habe viele Instanzen einer Anwendung auf einer IIS 6.0, Windows Server 2003 Box unter dem gleichen Anwendungspool installiert. Sie teilen sich viele der gleichen Assemblies und können nicht zu einer einzigen Anwendung zusammengefügt werden.

Ich habe kürzlich eine neue Instanz der Anwendung hinzugefügt und eine System.OutOfMemoryException erhalten, als ich versuchte, die ASP.NET 2.0-Anwendung zu laden.

Wird dieser Fehler durch die Verwendung des GAC zum Speichern gemeinsamer Baugruppen behoben, oder kann er nur dadurch behoben werden, dass die Sites zwischen verschiedenen Anwendungspools aufgeteilt werden?

1voto

Eric Z Beard Punkte 36325

Wenn Sie etwas im GAC ablegen, ändert sich nur der physische Speicherort der DLL (und die Sicherheitseinstellungen), nicht aber das, was in den Speicher geladen wird.

Die meisten Leute neigen dazu, den GAC als den Ort zu betrachten, an dem Microsoft seinen Kram ablegt. Ich habe noch nicht viele Anwendungen gesehen, die von "allen anderen" erstellt wurden und die die Verwendung des GAC rechtfertigen.

Sie sollten wahrscheinlich über eine Lastausgleichslösung nachdenken, wenn Sie Ihren Rechner mit so viel RAM belasten.

0 Stimmen

Der Ram ist überhaupt nicht ausgelastet. Es sieht so aus, als würde nur der Anwendungspool belastet werden. Leider habe ich nicht bemerkt, einen Bereich, um zu sehen, was die aktuelle RAM-Nutzung und Grenze eines Anwendungspools ist.

1voto

Vergewissern Sie sich, dass in der Machine.Config die Einstellung deployment retail = "true" gesetzt ist:

<system.web>
    <!--
        <deployment
            retail = "false" [true|false]
        />
    --> 
   <deployment retail="true" />
</system.web>

Debug-Code benötigt viel mehr Speicher als Nicht-Debug-Code, und die Kompilierung in einzelne Assemblies statt in eine pro Seite reduziert den Speicher-Overhead beim Laden von Assemblies.

Vergewissern Sie sich, dass die Speichereinstellungen für Ihre Anwendungspools hoch genug sind, und überprüfen Sie auch die ProcessModel MemoryLimit-Einstellung: http://msdn.microsoft.com/en-us/library/7w2sway1(VS.71).aspx

Versuchen Sie es mit einer Einstellung von 80 % oder 85 %:

<processModel 
  memoryLimit="80"
/>

0 Stimmen

Kann sich jemand dazu äußern, ob processModel memoryLimit gilt für alle .Net-Prozesse, oder nur ASP.Net?

0 Stimmen

"processModel" ist nur für ASP.Net, glaube ich: msdn.microsoft.com/de-us/library/7w2sway1(VS.71).aspx

0voto

MatthewMartin Punkte 31018

Eine gemeinsam genutzte Assembly in das GAC zu legen, spart Speicherplatz, z.B. wenn Sie 20 Asp-Anwendungen haben, die dieselbe DLL verwenden. Es könnte sein, dass Sie auch weniger Kopien derselben DLL in den Speicher laden, ich bin mir nicht sicher. Abgesehen davon werden OutOfMemoryErrors eher durch das Laden von extrem großen Objekten in den Speicher verursacht, ein typisches Beispiel ist ein DataSet. Assemblies sind klein im Vergleich zu dem Speicher, den man mit großen Datensätzen oder großen xml-Dateien im Speicher verbrauchen kann.

0voto

Bei welcher Art von Ersuchen ist dies geschehen? Vielleicht möchten Sie lesen über diese häufige Ursache von OutOfMemoryExceptions .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X