System.Runtime.InteropServices.COMException (0x80070008): Es ist nicht genügend Speicher verfügbar, um diesen Befehl zu verarbeiten

8

Ich versuche diese Ausnahme zu diagnostizieren:

%Vor%

Es sieht nicht so aus, als ob irgendwelche der normalen Arten von "Speicher" irgendwelche Grenzen erreicht haben. Die Anwendung verwendet ungefähr 400 MB Speicher, 70 Threads, 2000 Griffe und die Festplatte hat viele GB frei. Die Maschine läuft Windows 2003 Enterprise Server 32bit mit 16 GB RAM, so Speicher sollte kein Problem sein.

Die Anwendung wird als Windows-Dienst ausgeführt, sodass keine GDI-Objekte verwendet werden. Das Ausführen von GDI-Handles ist eine häufige Ursache dieser Ausnahme.

Datenbankverbindungen, Befehle & amp; Die Leser sind alle mit Blöcken umwickelt, so dass sie richtig aufgeräumt werden sollten.

UPDATE: Die Anzahl der verwendeten Threads von 12 auf 4 zu reduzieren, scheint das Problem behoben zu haben. Wir haben es über 24 Stunden geschafft, ohne Fehler zu laufen, bevor wir zwischen 4 und 8 Stunden dauerten. UPDATE2: Ich habe nie herausgefunden, von welcher Ressource wir ausgegangen sind, aber die Anzahl der Threads zu reduzieren scheint das Problem zu beheben. Oder zumindest versteckte es.

    
Darryl Braaten 12.03.2010, 19:19
quelle

3 Antworten

6

Ein weiterer Faktor, den Sie berücksichtigen müssen, ist die Speicherfragmentierung.

Die maximale einzelne Zuweisung, die Sie ausführen können, entspricht dem größten zusammenhängenden Speicherblock, der für den Prozess verfügbar ist. Dies ist fast immer weniger als die Gesamtmenge an Speicher, die aufgrund von Fragmentierung in dem Prozess verfügbar ist. Das sind zugeteilte Speicherblöcke, die zwischen zwei freien Speicherblöcken sitzen und den Speicher "fragmentieren".

Je mehr Fragmentierung Sie haben, desto kleiner ist der größte zusammenhängende Speicherblock, der verfügbar sein wird. Ich habe Situationen gesehen, in denen fast 1 GB Speicher frei war, aber der größte zusammenhängende Block war ungefähr 10 MB groß.

Haben Sie in diesem Prozess nach Speicherfragmentierung gesucht?

    
JaredPar 12.03.2010 19:25
quelle
2

Sie haben alle offensichtlichen Fehlerquellen für Ihren Prozess beseitigt. Macht es wahrscheinlich, dass dies tatsächlich ein Betriebssystemproblem ist. Die einzige Ressource, die auf einem Server immer unter Druck steht, ist der Kernel-Speicherpool. Es ist leicht zu sehen, TaskMgr.exe zeigt es auf der Registerkarte Leistung an.

Es entspricht in etwa Ihrem Aufruf-Stack. Es sieht so aus, als würde der Oracle-Provider Threads für einen Thread-Pool erstellen. Ein Thread benötigt ein Megabyte in Ihrem Prozess und 24 KB im Kernelspeicherpool, der als Stapel verwendet wird, wenn der Thread in den Kernelmodus wechselt.

Hintergrundinformationen finden Sie hier .

    
Hans Passant 17.03.2010 22:26
quelle
0

Es sieht so aus, als würde etwas zu viele Objekte auf dem Heap loopen und instanziieren, sodass auf dem Heap der Arbeitsspeicher knapp wird. Suchen Sie nach Loops im aufrufenden Code.

    
Richard Hein 12.03.2010 19:22
quelle

Tags und Links