Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
OutOfMemory Exception obwohl RAM erst bei 50 % Auslastung
bCoderer
myCSharp.de - Member



Dabei seit:
Beiträge: 101

Themenstarter:

OutOfMemory Exception obwohl RAM erst bei 50 % Auslastung

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1.961
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
bCoderer
myCSharp.de - Member



Dabei seit:
Beiträge: 101

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1.552
Herkunft: Südtirol/Italien

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
talla
myCSharp.de - Experte

Avatar #avatar-3214.jpg


Dabei seit:
Beiträge: 6.862
Herkunft: Esslingen

beantworten | zitieren | melden

Hallo,

an den Arrays alleine wird das nicht liegen. Grob überschlagen sind das ja nur 100 MB die reine Nutzdaten sind (35000*8 Byte*15*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.
private Nachricht | Beiträge des Benutzers
bCoderer
myCSharp.de - Member



Dabei seit:
Beiträge: 101

Themenstarter:

beantworten | zitieren | melden

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...
Attachments
private Nachricht | Beiträge des Benutzers
Easyrider
myCSharp.de - Member



Dabei seit:
Beiträge: 200
Herkunft: Bayern

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
bCoderer
myCSharp.de - Member



Dabei seit:
Beiträge: 101

Themenstarter:

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.812
Herkunft: Waidring

beantworten | zitieren | melden

Hallo codeRaC#er,
Zitat
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!"
private Nachricht | Beiträge des Benutzers