Laden...

OutOfMemory Exception obwohl RAM erst bei 50 % Auslastung

Erstellt von bCoderer vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.618 Views
B
bCoderer Themenstarter:in
101 Beiträge seit 2008
vor 12 Jahren
OutOfMemory Exception obwohl RAM erst bei 50 % Auslastung

Hallo Leute,

habe bei einer (nicht selbst geschriebenen) WinForms Anwendung das Problem dass immer eine OutOfMemory Exception ausgelöst wird. RAM wäre aber noch genug verfügbar.
Hab mir das ganze nun mit dem Process Explorer angesehen und da sehe ich wie die Heap Bytes in die Höhe schnallen bei der Berechnung (auf Mausklick) --> kommen ca. auf 1,5 GB. Im Code habe ich gesehen, dass Klassenmember mit double[35000] deklariert sind und ich denke da werden etliche davon erzeugt.

Habe Win7 x64 mit 4 GB RAM.

Habe schon einiges gelesen über den Large Object Heap - denke da liegt das Problem, weiß aber nicht was ich tun soll.

Besten Dank
Norbert

T
2.219 Beiträge seit 2008
vor 12 Jahren

Könnte am GC liegen.
Wenn er die Daten kopiert, kann es im schlimmsten Fall sein dass er fast den doppelten Speicher nutzen muiss.
Bei 1,5 GB wären es schon 3 GB.
Wenn das System dann noch mehr als 1 GB nutzt ist kein Speicher mehr da.

Kann aber ggf. auch einen anderen Grund haben.
scheinbar ist dann aber die WinForms Anwendunge schlecht programmiert wenn sie solche Array erzeugt 😕

Ansonsten wäre es auch gut zu wissen was das Programm tut.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

B
bCoderer Themenstarter:in
101 Beiträge seit 2008
vor 12 Jahren

Hi T-Virus,

also die Anwendung ist definitiv schlecht programmiert. Es geht um Zeitreihenberechnungen d.h. einem Kunden werden Ergebnisse von mehreren Zeitreihen zugewiesen (ca. 35000 Werte per Zeitreihe) und jeder Kunde hat ca. 15 solche Zeitreihen als Property in der Klassendefinition. Dazu kommt noch dass die Berechnung für alle Kunden im System läuft - ca. 25.

Kann ich das temporär durch mehr RAM bereinigen?
Und das komische daran ist, dass es auf einem virtuellen Server mit 2 GB RAM anscheinend (da war ich noch nicht im IN) funktioniert hat - wobei da sonst nichts darauf gelaufen ist.

Werd die Anwendung neu schreiben aber sie wird eben gebraucht in der Zwischenzeit.

Habe besten Dank

1.552 Beiträge seit 2010
vor 12 Jahren

Hallo Leute,
"Out Of Memory" bedeutet nicht "Out of RAM". Mehr RAM sind nur für die Performance nützlich und nicht für die Möglichkeit der Ausführung eines Programmes.

Siehe unter anderem:
“Out Of Memory” Does Not Refer to Physical Memory

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

6.862 Beiträge seit 2003
vor 12 Jahren

Hallo,

an den Arrays alleine wird das nicht liegen. Grob überschlagen sind das ja nur 100 MB die reine Nutzdaten sind (350008 Byte15*25). Was für Berechnungen werden denn damit angestellt? Gibts da vielleicht Stellen wo viel Daten kopiert werden müssen?

Lass einfach mal nen MemoryProfiler rüberlaufen im Zweifelsfall.

Dann xxMUROxxs Link berücksichtigen - Du schreibst zwar Win 7 x64, aber läuft die Anwendung auch als 64 Bit Anwendung?

Ebenso können ausgehenden Window Handles und ähnliches ebenfalls eine OutOfMemoryException auslösen.

Baka wa shinanakya naoranai.

Mein XING Profil.

B
bCoderer Themenstarter:in
101 Beiträge seit 2008
vor 12 Jahren

Hi Leute,

danke für die Hilfe erstmal!

Habe die Anwendung nun unter x64 laufen lassen - und es funktioniert. Und ich denke (hab den Code erst 2 Tage) es werden etliche Kopieroperationen ausgeführt.

Komisch ist jedoch dass die Hauptanwender auf XP x32 arbeiten und angeblich hat es immer funktioniert.
Habe euch ein Screenshot über den CLR Speicherverbrauch angehängt - vielleicht kann mir ja wer sagen was da abgeht...

E
200 Beiträge seit 2006
vor 12 Jahren

OT: Egal was da im Hintergrund gemacht wird, der Speicherverbrauch ist exorbitant zu hoch. Sowas kann man von keinem Anwender verlangen, wenn man nicht gerade hochaufwendige mathematische Berechnungen anstellt. /OT

B
bCoderer Themenstarter:in
101 Beiträge seit 2008
vor 12 Jahren

Tja, das is klar!
Nur wäre ich trotzdem dankbar wenn mir jemand dazu eine Erklärung abgeben könnte...wie hängt das mit dem RAM zusammen bzw. wann weiß ich wie viel Speicher ich benötige?

Wäre für jeden Tipdankbar...

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo codeRaC#er,

wann weiß ich wie viel Speicher ich benötige?

Das weiß der GC, der auf für die Speicherreservierung zuständig ist. I.d.R. brauchst du dich (glücklicherweise) nicht darum kümmern.

Wenn der GC jedoch den Speicher nicht freiräumen kann, da z.B. noch Referenzen existieren od. Objekte gepinnt sind, dann kann es zu diesem Fehler kommen.

Ich weiß nicht welchen Profiler du verwendet hast, aber z.B. der CLR Profiler for .NET Framework 4 teilt dir auch mit wo zu viel Speicher verbraten wird. Schau dir das mal an. Wir können so nur raten.

@T-Virus: dass der GC Speicher kopiert ist mir neu. Er verschiebt in nur und insofern halte ich deine obige Aussage für nicht korrekt.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"