Forum: PC-Programmierung C# große Datenfelder finden


von Mirco C. (Firma: s@Td) (mcontroller)


Lesenswert?

Hallo,

ich habe ein C# WinForms Anwendung die eine externe Komponente (Canvas) 
benutzt. Leider wird irgendwo ein Array befüllt aber nicht entleert, 
sodass der Speicherverbrauch an die Grenzen kommt. Gibt es eine 
Möglichkeit diese großen Datenfelder aufzudecken? (VS oder #Develop)

von Lutz H. (luhe)


Lesenswert?

Ich würde versuchen mir die Größe der Objekte z.B. mit der length 
Eigenschaft auf den Bildschirm anzuzeigen, oder  mit  watch , der 
Überwachung, nachschauen.

von bb (Gast)


Lesenswert?

Hast du vielleicht ein Dispose vergessen?

Ansonsten habe ich mit dem ANTS Memory Profiler sehr gute Erfahrungen 
gemacht:
http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/

von Marcus W. (marcusaw)


Lesenswert?

mMn hat C# (zumindest im .NET-Framework) einen Garbage-Collector, so 
dass das nicht passieren dürfte, wenn du es nicht explizit verlangst.

von Borislav B. (boris_b)


Lesenswert?

Marcus W. schrieb:
> ...einen Garbage-Collector, so
> dass das nicht passieren dürfte, wenn du es nicht explizit verlangst.

Man muss aber schon aufpassen. Trotz GC kann man noch sehr leicht 
Memory-Leaks produzieren (selbst wenn kein Native Code im Spiel ist).
Z.B. Event-Handler sind eine böse Falle. Wenn da ein Objekt registriert 
ist, hängt es natürlich noch im Speicher, obwohl alle anderen Referenzen 
die man so hat schon freigegeben wurden. Sowas kann man leicht 
übersehen.

Manchmal hilft dann wirklich nur noch der Memory Profiler.
Damit kommt man dann aber sehr schnell und zuverlässig ans Ziel, da 
dieser genau anzeigt welche Objekte von wem wie gehalten werden.

von Jenny (Gast)


Lesenswert?

Gerade .Net zeigt dir doch beim Debuggen im Visual Studio an wo der 
Stack oder heapoverflow auftritt.

von Markus V. (valvestino)


Lesenswert?

Jenny schrieb:
> Gerade .Net zeigt dir doch beim Debuggen im Visual Studio an wo der
> Stack oder heapoverflow auftritt.

Es wäre schon ein riesen Zufall, wenn ausgerechnet die 
Speicherallokation, die die Exception auslöst, auch das Memory Leak 
wäre.

Nein, die einzig vernünftige Möglichkeit (weil ohne Rumstochern) ist 
tatsächlich ein Memory-Profiler. Den muss man ja nich gleich kaufen. 
I.d.R. bieten die Hersteller eine 30-Tage-Testlizenz zum Ausprobieren. 
Wir verwenden z.B. diesen hier: http://memprofiler.com/ . Mit dem 
Redgate Profiler hatten wir bei großen Systemen leider massive Probleme.

Grüße
Markus

von Olli (Gast)


Lesenswert?

Evtl. allokiert die externe Komponente auch am Framework vorbei noch 
irgendwo Speicher? Ich rate auch zum Profiler.

von procter (Gast)


Lesenswert?

ich bin da ganz bei bb.
Wenn Bilder benutzt werden, die ja dann logischerweise im Canvas 
gepinselt werden muss man das Teil mit Dispose per Hand wieder 
wegmachen; da hilft einem der GC nicht weiter.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.