Entwickler-Ecke
WinForms - Automatische Speicherverwaltung
m.keller - Mo 13.01.14 11:41
Titel: Automatische Speicherverwaltung
Hallo ihr Cracks,
Ich bin nun soweit mit meiner Anwendung fertig.
Nun habe ich noch was von der Automatischen Speicherverwaltung gelesen.
Diese würde ich gerne einbringen, denn die Anwendung soll auf einem Micropc laufen der nicht gerade viel Arbeitsspeicher zur Verfügung hat.
Zum testen der Funktion habe ich ein Programmcode kopiert und gehofft das ich in der Leistungsüberwachung irgend etwas feststellen kann.
Leider ohne erfolg.
Der benötigte Speicher wird immer mehr mit jedem Aufruf von der Funktion.
Kann mir einer dies mal erklären?
Ich habe im Internet zwar gesucht, werde aber irgendwie daraus nicht schlau, wie ich das anstellen muss um den Speicher wieder freigegeben zu bekommen.
Hier der code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67:
| namespace GoloRoden.GuideToCSharp { public class Foo : IDisposable { private bool _isDisposed;
~Foo() { this.Dispose(false); }
private void Dispose(bool isDisposeByUser) { if (isDisposeByUser) { }
GC.SuppressFinalize(this);
this._isDisposed = true; }
public void Dispose() { if (this._isDisposed) { throw new ObjectDisposedException( this.ToString()); }
this.Dispose(true); } } } |
und in Main
C#-Quelltext
1: 2: 3: 4: 5:
| using (GoloRoden.GuideToCSharp.Foo foo = new GoloRoden.GuideToCSharp.Foo()) { } |
Ralf Jansen - Mo 13.01.14 12:08
Dispose macht ja auch nix. Dispose ist dafür gedacht Resourcen die nicht direkt Teil der gemanagten .Net Welt freizugeben. Also Dinge die eher zu Windows selbst oder Fremdsystemen gehören. Standardbeispiel wären Dateien und deren Handles. Die Dispose Routine in deinem Beispiel ist aber eine leere Implementierung die erstmal nix tut da keine entsprechenden Resourcen verwendet werden.
.Net Resourcen werden vom GC freigegeben und zwar dann wenn der GC entscheidet das es notwendig ist. Wenn du in der Leistungsverwaltung also kein freigeben von Speicher siehst hat der GC noch keinen Grund gesehen irgendwas freizugeben da noch genügend verfügbar ist.
m.keller - Mo 13.01.14 12:13
Das heißt also, dass Ressourcen von z.b. Zuweisungen in einer dll freigegeben werden, oder wie kann ich das verstehen?
Und GC wird ausgeführt wenn er meint es wäre nötig?
Stellt er dann die Ressourcen von Variablen usw. aus meinem Programm frei oder welche?
Ralf Jansen - Mo 13.01.14 12:30
| Zitat: |
| Und GC wird ausgeführt wenn er meint es wäre nötig? |
Man kann den auch selbst aufrufen. Es ist aber in fast 100% der denkbaren Fällen falsch das zu tun. Der GC weiß es besser. Insbesondere auch da er das Gesamtsystem berücksichtigt und nicht nur die egoistische Perspektive des eigenen Prozesses.
| Zitat: |
| Stellt er dann die Ressourcen von Variablen usw. aus meinem Programm frei oder welche? |
Es werden nach einem bestimmten
Verfahren [
http://msdn.microsoft.com/de-de/library/ms973837.aspx] nicht mehr referenzierte .Net Objekte freigegeben. Egal wo die herkommen. Es müssen halt nur .Net Objekte sein. Für dich als Author heißt es das du nur darauf zu achten hast Dinge die du nicht mehr brauchst nicht mehr zu referenzieren. Das passiert meist implizit weil Variablen aus dem Skope laufen etc. ab und zu muß man das aber auch explizit selbst machen z.B. in dem man Variablen mit Referenztypen explizit auf null setzt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!