Ressouren freigeben



  • Hallo Forum,

    ich programmiere gerade ein kleines Wizzard und hab beim Debuggen mal den Taskmanager laufen gehabt um zu schauen, was das Programm an Speicher frisst.

    Ich war ehrlich erstaunt, was da so drauf geht. Die erste Aktion (Datei öffnen und Daten in einer Tabelle anzeigen) verdoppelt gleich mal den zugewiesenen Speicher von etwa 13 MB auf 24 MB. Jetzt würde ich aber gern, wenn ich das Wizzard auf "Start" zurücksetze, auch wieder auf die 13 MB runter kommen.

    Programmzeilen wie:
    myTable->Dispose();
    Datagrid->Dispose();

    bringen da überhaupt nichts. Wie bekomme ich also den Speicher wieder frei? 😕

    danke
    physici



  • Was im Taskmanager an Speicher steht ist der zugesicherte Speicher, dein Programm nimmt lange net soviel ein. Wenn du dein Programm startest und sagen wir du führst ne speicherintensive Aufgabe aus, dann sichert sich nen .Net Programm erstmal pauschal ne Menge Speicher obwohl es den gar net brauch. Das liegt auch mit der Garbage Collection Strategie zusammen. Wird nun Speicher freigegeben, wird der trotzdem fürs Programm behalten. So sind neuere Speicheranforderungen dann viel schneller. Und gerade weil der GC im Hintergrund werkelt, wird laufend Speicher freigegeben und durch Erzeugen von Objekten angefordert. Wenn man jedes mal den Speicher wirklich komplett freigeben würde, wäre des ganze saulangsam. Objekte erzeugen geht, unter anderem dadurch, im .Net Framework schneller als in C++.

    Es ist jetzt nun aber auch nicht so, dass der Speicher ungenutzt brach liegt. Wenn jetzt ein anderes Programm den Speicher benötigt, wird er auch sofort freigegeben durchs .Net Framework. Das kann man auch gut selber testen. Man startet einfach so viele Instanzen des .Net Programms bis der Arbeitsspeicher voll ist. Die letzten Instanzen die erzeugt wurden als Speicher knapp war, brauchen viel weniger RAM als die ersten die sich noch was leisten konnten.

    Wenn die Anzeige des Taskmanagers trotzdem stört kannst du auch die WorkingSize trimmen(gibts irgend ne WinApi Funktion), aber das geht unter Umständen auf die Performance da dann soviel freigegeben wird, das Codeteile gecacht werden auf der Festplatte - obwohl sie ohne Probleme im RAM hätten behalten können.



  • Besten Dank, für die Aufklärung.
    Werd da einfach mal nicht dran rumwerkeln, wenn das mit der Speicherreservierung nach dem Prinzip "as much as possible" läuft. Ansonsten steig ich auf __nogc um 😃


Anmelden zum Antworten