none
String List sprengt RAM RRS feed

  • Frage

  • Hallo Community,

    kurz und knapp:

     

    Ich habe eine List<string> mit der ich in meiner Applikation arbeite.

    Diese Liste hat ca. 6000 Einträge.

    Nach mehrmahligem leeren und befüllen besagter Liste ist mein RAM bis zum Anschlag voll.

    Kann mir jmd. helfen wie ich den nichtmehr verwendeten RAM wieder freigeben kann ?!

     

    LG

    R&R

    Dienstag, 26. Juli 2011 13:26

Antworten

  • Nicht lange, sind nur einzelne Wörter bis max 16 Zeichen.

    Werde es gleich mal mit dem Garbage Collector ausprobieren.

     

    edit: Das Problem war ein anderes, aber danke für die Idee mit der GC, echt cool kannte ich noch nicht.



    Dienstag, 26. Juli 2011 13:38

Alle Antworten

  • Das Problem kann viele Ursachen habe. Wie lang sind die Strings, wie oft änderst du diese?

    Ggf hilft es schon, den Garbage Collector mal zum Arbeiten einen Anstoß zu geben:

    System.GC.Collect();
    //System.GC.WaitForPendingFinalizers();//Wenn du warten willst, bis aufgeräumt wurde
    

     

    Dienstag, 26. Juli 2011 13:35
  • Nicht lange, sind nur einzelne Wörter bis max 16 Zeichen.

    Werde es gleich mal mit dem Garbage Collector ausprobieren.

     

    edit: Das Problem war ein anderes, aber danke für die Idee mit der GC, echt cool kannte ich noch nicht.



    Dienstag, 26. Juli 2011 13:38
  • Hallo R&R,

    Noch einige Hinweise mit auf den Weg:

    > Kann mir jmd. helfen wie ich den nichtmehr verwendeten RAM wieder freigeben kann ?!

    Dafür sorgt der GC selber. Du mußt eigtl. gar nichts tun als dafür zu sorgen, dass nicht mehr verwendete Strings unerreichbar sind und bleiben (d.h. es gibt kein Objekt mehr, dass diese direkt oder indirekt referenziiert).

    Sobald Du diese Objekte freigibst, kann der GC seine Arbeit verrichten und aufräumen. Natürlich könnte man GC.Collect() auch selbst im Code aufrufen, aber u.U. schadet das mehr als es nutzt.

    Es gibt freilich Umstände, die den GC bei seiner Arbeit hindern, wie z.B. ein stark fragmentierter LOH (large object heap) oder ein fragmentierter unverwalteter virtueller Speicher, aber - wie gesagt - das kommt seltener vor, dann ist umsichtiges Profilen nötig.

    Lade den CLR Profiler herunter und profile Deine Anwendung. So kannst Du leicht sehen, wer Referenzen auf String-Objekte hält, oder ob der LOH mit Strings >85K gefüllt ist. Unter Umständen kann auch StringBuilder für die Fragmentierung des LOH verantwortlich sein. Wenn Du im schnellen Tempo die String alloziierst und wieder zerstörst, sorge dafür dass die nicht mehr verwendeten Strings unerreichbar sind und vom GC eingesammelt werden können. Sonst werden sie zu älteren Generationen promotet.

    Gib also nicht nur die List<String> frei, sondern auch andere Objekte, die evtl. Referenzen auf diese Strings halten, sobald diese nicht mehr benötigt werden. Und sag uns bitte, was Du unter "sprengt RAM" verstehst. Erhältst Du eine OutOfMemoryException oder verläßt Du dich einfach auf das was Task-Manager anzeigt?

    Siehe auch: GC Memory Collection
    http://social.msdn.microsoft.com/Forums/en-US/clr/thread/bd901859-7a1c-4ca9-86ac-907250c3bb87/#4edb62ec-4409-40ee-933c-61c205b6006a

    CLR Profiler:
    http://www.microsoft.com/download/en/details.aspx?id=16273

    Gruß
    Marcel


    Dienstag, 26. Juli 2011 14:31
    Moderator