2 Stimmen

System.OutOfMemoryException beim WCF-Webdienst

Ich habe mit einer System.OutOfMemoryException zu kämpfen, wenn ich einen Importprozess durchführe, bei dem eine Menge Objekte erstellt werden.

Dies hat zur Folge, dass die ASPNET_WP.EXE auf 1,4 GB aufgebläht wird und die Ausnahme ausgelöst wird.

Ich habe bereits versucht, IDisposable zu implementieren und den Garbage Collector (GC.Collect()) in den zuständigen Funktionen aufzurufen, aber ohne Erfolg.

Der Server ist ein QuadCore (C2Q) mit 4 GB RAM. Auch wenn mehr RAM als 1,4 GB frei ist, wird die Ausnahme immer ausgelöst, wenn die aspnet_wp.exe 1,4 GB erreicht.

Was kann ich tun, um diese OutOfMemory-Probleme zu vermeiden?

Die genaue Ausnahmemeldung lautet:

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at
OpenAccessRuntime.DataObjects.PersistenceManagerFactoryBase.
CreatePersistenceMangerImp(StorageManger sm)
at
....

2voto

marc_s Punkte 701497

Ein Wort: selbstgehostet .

IIS hat Einschränkungen und Warzen, wenn es um die Speicherverwaltung geht, und wenn Ihr WCF-Dienst wirklich mehr als 1,4 GB Speicher auf dem Server verwenden muss, dann müssen Sie diesen WCF-Dienst selbst hosten, in einer Konsolenanwendung, einem NT-Dienst, einer Winforms-Anwendung - welchen Weg Sie auch immer wählen.

Kurze Frage jedoch: wie wird Ihr Server 10 gleichzeitige Anfragen bearbeiten, wenn die Bearbeitung jeder Anfrage 1,4 GB Speicherplatz beansprucht....

Versuchen Sie, Dateien zurückzusenden oder ähnliches? In diesem Fall sollten Sie sich Folgendes ansehen WCF-Streaming die es Ihnen ermöglicht, den auf dem Server benötigten Pufferspeicher erheblich zu reduzieren.

Marc

1voto

James Black Punkte 41034

Können Sie Ihren Import stückweise durchführen, anstatt schnell viele Objekte zu erstellen und diese dann zu entsorgen?

Vielleicht möchten Sie genauer erklären, was vor sich geht und wie Sie den Import bearbeiten.

Können Sie z. B. jedes Objekt vollständig bearbeiten und speichern und dann ein anderes Objekt bearbeiten?

Vielleicht sollten Sie sich einen Speicher-Profiler zulegen. Hier sind einige Open-Source-C#-Profiler: http://csharp-source.net/open-source/profilers

Ich würde auf zwei Dinge achten.

  1. Können Sie Ihre Algorithmus ändern, um dies zu verhindern.
  2. Erfahren Sie mehr darüber, warum dies geschieht.

0voto

Chris Punkte 38327

Denken Sie daran, dass Sie nicht Zugriff auf den gesamten Speicher erhalten, wenn Sie in asp.net ausgeführt werden, es wird nur 2gigs mit einer Standardkonfiguration erlauben. Vielleicht sollten Sie diese Farm aus, um einen Windows-Dienst oder eine Konsole app.

Siehe hier: "Tatsache: In einem Standard-Setup haben Ihre Worker-Prozesse immer 2 GB virtuellen Speicher zur Verfügung (unabhängig davon, ob Sie 1, 2 oder 4 GB physischen Speicher im Rechner haben)."

http://jesperen.wordpress.com/2007/05/23/understanding-aspnet-memory/

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