tutorials.de Buch-Aktion 02/2012
Like Tree1Danke
  • 1 Beitrag von Nico Graichen
ERLEDIGT
NEIN
ANTWORTEN
12
ZUGRIFFE
15593
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    Aug 2002
    Ort
    Passau / Bayern
    Beiträge
    344
    Hallo zusammen!

    Ich hab da mal eine grundlegende C#.NET-Frage. So wie ich das verstanden habe erledigt doch die Garbage Collection von .NET die komplette Speicherverwaltung, oder? Sie gibt also auch den nicht mehr benötigten Speicher wieder frei.

    Nun, wieso wird dann überall geschrieben, dass man Dispose() zum Freigeben des Speichers verwenden sollte. Okay, bei größeren Resourcen seh ich´s ja ein. Die sollten so schnell wie möglich wieder freigegeben werden, wenn sie nicht mehr benötigt werden. Aber ansonsten?

    Wer kann mir also einen kleinen Crash-Kurs in Sachen C#.NET´s Speicherverwaltung geben?

    DANKE im Vorraus******

    MfG
    Mike
     
    Das Leben ist sch**ße ... aber die Grafik ist geil!

  2. #2
    Vaethischist Tutorials.de Gastzugang
    Ich kann zwar nicht für C# sprechen, aber in C++ ist die Garbage-Collection nur für lokal erzeugte Objekte, aber nicht für Objekte auf dem Heap zuständig. Dort werden mittels new erzeugte Objekte gespeichert (also im Prinzip alles was irgendwie mit Zeigern zu tun hat, kommt auf den Heap). Diese werden nicht automatisch entfernt.

    Bsp:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
     
    ...
    {
    CFile file;
    CFile* fileptr = new CFile();
     
    ...
    }

    file wird bei Verlassen des Blocks entfernt, fileptr auch, aber der allozierte Speicher (für das CFile-Objekt) nicht. Beim Debug-Run kommt dann am Ende etwas mit "Detected Memory Leaks...", was einen darauf hinweist, das irgendwo ein alloziertes Objekt auf dem Heap rumschwirrt, das da nix zu suchen hat.
     

  3. #3
    Registriert seit
    Aug 2002
    Ort
    Passau / Bayern
    Beiträge
    344
    Danke für Deinen Beitrag ... aber zwischen C++ und C# liegen Welten, so glaube ich nicht, dass man die Speicherverwaltung beider Sprachen vergleichen kann.

    Trotzdem danke.
     
    Das Leben ist sch**ße ... aber die Grafik ist geil!

  4. #4
    Vaethischist Tutorials.de Gastzugang
    Das mit den Welten glaube ich kaum... Die Garbage-Collection von Heap-Objekten ist weder trivial noch macht sie Sinn, wenn man weiß was man tut.
     

  5. #5
    Registriert seit
    Aug 2002
    Ort
    Passau / Bayern
    Beiträge
    344
    Du bist nicht zufällig mein C++ Lehrer aus der Schule, oder? *fg*
    Ironischerweise war das auch der Kursleiter von C#.

    Aber ich habs mittlerweile schon rausbekommen:
    Die Garbage Collection von .NET regelt komplett alles. Man benötigt Dispose() nur dann, wenn man explizit wünscht, dass ein Objekt zu einem bestimmten Zeitpunkt zerstört wird und dessen Speicher freigegeben werden soll. Ansonsten regelt das die Garbage Collection, wenn die CPU genügend Freiraum hat, um die Arbeiten zu erledigen.
     
    Das Leben ist sch**ße ... aber die Grafik ist geil!

  6. #6
    Avatar von Asterix-Ac
    Asterix-Ac Asterix-Ac ist offline Mitglied Gold
    Registriert seit
    Jul 2003
    Ort
    Aachen (NRW)
    Beiträge
    215
    Hi,

    Der Garbage Collector ist die Müllverbrennungsanlage von .NET.

    Normaler Weise hast Du keinen Einfluss darauf, wann der GC läuft. Das entscheidet das System. Du kannst ihn aber auch selber aktivieren. Damit solltest Du aber sparsam umgehen. -> Systemleisung sinkt rapiede.
    Du kannst ihn benutzen, wenn Du ein Objekt mit <objekt> = null; zerstörst.
    Wenn Du mehrere Objekte zerstörst, lass den GC erst am Ende laufen.

    Der Aufruf : GC.Collect();
    Wird von System geerbt, da in der System.Object deklariert und statisch.

    Asterix
     

  7. #7
    Registriert seit
    Aug 2002
    Ort
    Passau / Bayern
    Beiträge
    344
    Alles klar, VIELEN DANK!
     
    Das Leben ist sch**ße ... aber die Grafik ist geil!

  8. #8
    pcservice-schumacher pcservice-schumacher ist offline Grünschnabel
    Registriert seit
    Jul 2003
    Ort
    Kreuzau (NRW)
    Beiträge
    2
    Hallo,

    Zu bestimmten Zeiten werden alle Objekte einer .NET-basierten Anwendung vom Garbage Collector durchlaufen, um diejenigen zu suchen, die nicht mehr referenziert werden. Letztere werden erst nach dem Auffinden tatsächlich endgültig verworfen. Der GC hat aber eine ihn kennzeichnende, spezifische Eigen-schaft: Es kann nicht vorhergesagt werden, wann er seine Arbeit aufnimmt. Ein freigegebenes Objekt wird also solange sein Dasein im Speicher fristen, bis der Garbage Collector es entdeckt – trotzdem ist es für den Programmcode unerreichbar.
    Damit stellt sich sofort die Frage, nach welchen Kriterien der GC seine Arbeit aufnimmt. Als selbstständi-ge Ausführungseinheit (Thread) genießt er keine hohe Priorität und kann erst dann den Prozessor in An-spruch nehmen, wenn die Anwendung selbst beschäftigungslos ist. Theoretisch könnte das bedeuten, dass eine gestresste Anwendung dem Garbage Collector keine Chance lässt, überhaupt jemals in Aktion zu treten. Dem ist tatsächlich so, es gibt aber eine entscheidende Einschränkung: Noch bevor den Speicherres-sourcen der Anwendung die „Luft ausgeht“, ist die zweite Bedingung erfüllt, um die Speicherbereinigung mit dem Garbage Collector anzustoßen.
    Der Garbage Collector wird spätestens dann nach allen nicht referenzierten Objekten suchen und ihren Speicherplatz freigeben, wenn die Speicherressourcen knapp werden.
    Der Anstoß zum Einsammeln aller aufgegebenen Objekte kann im Programmcode mit

    System.GC.Collect();

    angestoßen werden. Die Suche nach allen freigegebenen Objekten nimmt natürlich Zeit in Anspruch und führt zu Performanceverlusten der laufenden Anwendung. Daher ist es nicht empfehlenswert, ohne ein gewichtiges Argument grundsätzlich bei jeder Objektzerstörung „zur Sicherheit“ zusätzlich immer den Aufräumprozess zu aktivieren.
     

  9. #9
    Argbeil Argbeil ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    17
    Original geschrieben von Vaethischist
    Ich kann zwar nicht für C# sprechen, aber in C++ ist die Garbage-Collection nur für lokal erzeugte Objekte, aber nicht für Objekte auf dem Heap zuständig. Dort werden mittels new erzeugte Objekte gespeichert (also im Prinzip alles was irgendwie mit Zeigern zu tun hat, kommt auf den Heap). Diese werden nicht automatisch entfernt.

    Bsp:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
     
    ...
    {
    CFile file;
    CFile* fileptr = new CFile();
     
    ...
    }

    file wird bei Verlassen des Blocks entfernt, fileptr auch, aber der allozierte Speicher (für das CFile-Objekt) nicht. Beim Debug-Run kommt dann am Ende etwas mit "Detected Memory Leaks...", was einen darauf hinweist, das irgendwo ein alloziertes Objekt auf dem Heap rumschwirrt, das da nix zu suchen hat.
    Das was du meinst hat mit Garbage Collection nichts zu tun, es gibt im ANSI/ISO c++ auch keine Garbage Collector, nur in C++.NET (managed C++).

    Wenn du den Speicher unbeding wieder freigeben willst solltest du deiner Klasse eine Dispose() Methode hinzufügen und von Hand aufrufen. Diese Methode sollte dann alle Ressource wieder freigen (Verbindungen schließen oder Referenzen auf NULL setzen) Damit umgehst du den GC Performanceeinbruch. Die Klasse selber wird dann irgendwann vom Garbage Collector zerstört, dies passiert spätestens dann wenn du den Speicher wieder benötigst.
     

  10. #10
    prodoehl prodoehl ist offline Grünschnabel
    Registriert seit
    Sep 2005
    Beiträge
    2
    Ich habe da leider so meine Zweifel, ob es wirklich passiert, wenn Speicher benötigt wird. Ich bekomme bei einer grossen Optimierung immer wieder Abbrüche weil der Speicher voll ist. Recht enttäuschend aber sieht leider so aus.
     

  11. #11
    Argbeil Argbeil ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    17
    Was meinst du mit "bei einer großen Optimierung" ? Wenn bei einer Anwendung von dir der Speicher überläuft liegt das mit Sicherheit nicht am GarbageCollector.
     

  12. #12
    prodoehl prodoehl ist offline Grünschnabel
    Registriert seit
    Sep 2005
    Beiträge
    2
    Zitat Zitat von Argbeil Beitrag anzeigen
    Was meinst du mit "bei einer großen Optimierung" ? Wenn bei einer Anwendung von dir der Speicher überläuft liegt das mit Sicherheit nicht am GarbageCollector.
    Schön wäre es. Es sieht so aus als ob die GC durch die Optimierung einfach nicht die Zeit bekommt zu laufen. Die Anwendung ist nur zum Teil von mir, aber der Softwarelieferant schwört, dass sein Programm die Resourcen freigegeben hat. Nur die GC hat sie halt noch nicht gefunden. Sehr ärgerlich
     

  13. #13
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.883
    Blog-Einträge
    34
    Wir wissen immer noch nicht, was mit "großer Optimierung" gemeint ist!

    Wenn der GC freigegebene Ressourcen nicht wegräumt, sind doch irgendwo noch Referenzen darauf vorhanden oder sie sind nicht verwaltet.
    Alex F. bedankt sich. 
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

Ähnliche Themen

  1. [vb] Uniprocessor-System Garbage Collection
    Von Raabun im Forum .NET Café
    Antworten: 1
    Letzter Beitrag: 19.03.09, 12:09
  2. Antworten: 0
    Letzter Beitrag: 15.12.06, 09:56
  3. Garbage Collection in c#
    Von zioProduct im Forum .NET Café
    Antworten: 2
    Letzter Beitrag: 11.01.06, 10:57
  4. Verschiedene JVM Flags zu Garbage Collection Tuning
    Von Thomas Darimont im Forum Java Technology News
    Antworten: 0
    Letzter Beitrag: 27.11.05, 23:45
  5. Dispose
    Von hbz im Forum .NET Archiv
    Antworten: 0
    Letzter Beitrag: 31.12.03, 13:13