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
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.
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
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
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.
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...
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
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...
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!"