Announcement

Collapse
No announcement yet.

Speicherverwaltung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Speicherverwaltung

    Hallo zusammen,

    also ich habe da mal eine Frage:

    Was macht .NET mit dem ganzen Speicher im PC?

    Also folgende Situation:

    Ich habe eine kleine Demoanwendung geschrieben.
    Das gibt es Komponenten wie ListView, Timer, ImageList, StatusBar, Button.
    So!
    Jetzt startet die Anwendung, und im Timer-Intervall soll eine Eintrag in der ListView erscheinen, natürlich mit Icon in der Detailansicht. Die Detailansicht umfasst eine Column. Ausgabe des Textes in der Listview ist einfach ein kleiner Text von ca. 20 Zeichen plus dem Wert des aktuellen Counts der Listview-Items.

    Die Anwendung startet mit ca. 22MB im RAM. Alle 2 Sekunden nimmt sich die Anwendung 4 - 8 oder manchmal sogar 12 KB mehr. Jetzt habe ich mir das Spielchen etwas angesehen, habe aber nie gesehen, das Speicher freigegeben wurde. Und jetzt zur eigentlichen Problematik.
    Diese Anwendung (mit natürlich etwas mehr Inhalt und auch Logik) soll demnächst auf einem Server laufen. Da Server ja bekanntlich etwas länger durchlaufen als normale Desktop-PCs, habe ich das leichte Schwierigkeiten/Denkprobleme was den Speicher angeht.

    Jetzt habe ich mir gedacht, dass ich alle 100 Zeilen (Items) ein „Clear“ auf die Items durchführe. Das führte dazu, dass der Speicher nicht ganz so schnell "allokiert" wird. Aber auch hier sehe ich keine Freigabe des RAMs. Mache ich etwas falsch, oder brauche ich jetzt einen PC mit irre viel RAM? Kann man die GC von .NET beeinflussen, wenn ja wie? Gibt es eine andere Möglichkeit dieser Situation Herr zu werden, ohne auf grafische Ausgaben verzichten zu müssen?

    Ich kann mir ehrlich nicht vorstellen, das ich der Einzige mit solchen Problemen sein soll, oder etwa doch !?

    Danke für die Hilfe . . .

    Gruß

    Sascha

  • #2
    Hi

    .Net hat eine Garbage Collection. Das heisst, wenn ein Objekt nicht mehr "gebraucht" wird (= es keine Referenzen mehr auf das Objekt gibt), wird das Objekt für die Garbage Collection markiert. Es wird nicht sofort freigegeben. Es gibt verschieden Levels, welches ein markiertes Objekt durchläuft, bis es dann endgültig gelöscht und der Speicher freigegeben wird.
    <P>
    Die Garbage Collection hat eigene, optimierte Alghorithem um diesen Job zu erledigen. Und es ist nicht sinnvoll diese zu beeinflussen. Die Garbage Collection entscheidet in der Regel, zu welcher Zeit sie aufräumt.
    <P>
    Mit GC.Collect() kannst Du die Garbage Collection forcieren. Das ist möglich, empfehle ich aber nicht!
    <P>
    Es ist natürlich so, dass wenn Du Items in dein ListView aufnimmst und nicht mehr entfernst, der Speicherbedarf nur ansteigt und nicht abnimmt. Es ist also korrekt, dass Du nicht mehr benötigt Items aus der Listview löschst. Der Speicher muss wieder abnehmen, nachdem Du die Items gelöscht hast. Das kann aber relativ lange dauern.
    <P>
    Ich hoffe mit diesen Erklärungen geholfen zu haben.
    <P>
    Simo

    Comment


    • #3
      Ja, so ein Problem habe ich leider auch.<br>
      Auf einem Form, in einem Panel erzeuge ich dynamisch,<br>
      für eine Vorschau von Bildern kleine PictureBoxen.<br>
      In diese Boxen lade ich die Bilder. Brauche ich die die Vorschau<br>
      nicht mehr, werden die Boxen aus dem Panel gelöscht und das Form mit
      <b>Dispose</b> freigegeben.<br>
      Lasse ich mir hintereinander die gleiche Vorschau anzeigen, kommt<br>
      die Meldung, dass der Arbeitsspeicher nicht ausreicht.<br>
      Ähnliche Effekte habe ich auch noch in anderen Situationen bemerkt.<br>
      Aus meiner Sicht arbeitet der GC nicht zuverlässig.<br>
      <br>
      Mit freundlichen Grüßen<br>
      <br>
      U. Richte

      Comment


      • #4
        Beim Arbeiten mit Bildern lohnt es sich, jeweils die Image-Instanzen selber explizit mit Dispose freizugeben. Nicht etwa nur das Form, sondern die Images selber. Denn wenn du nur das Form zerstörst, zerstört dieses zwar auch die PictureBoxes, aber diese zerstören imo die Images selber nicht (dürfen sie auch nicht, schliesslich könntest du die Images noch anderswo verwenden), d.h. die Bilddaten selber bleiben noch im Speicher ... mit Dispose direkt auf den Image Instanzen hatte ich nie mehr irgendwelche Speicherprobleme - im Gegenteil, läuft nun alles sehr zuverlässi

        Comment


        • #5
          Hallo zusammen, also erstmal vielen Dank an alle. Jetzt sehe ich die Sache zumindest etwas anders.

          Aber bezüglich meiner Situation. Wie gesagt, soll die Anwendung irgendwann auf einem Server laufen. Jetzt werde ich versuchen alle nicht mehr benötigten Item zu löschen, aber da stellt sich meiner meiner nach auch schon das nächste Problem. Wie das so bei neuen Anwendungen sein muss, muss die Oberfläche schön, bunt, einfach aber dennoch alle Infos dem Benutzer zeigen. Kann man per Programm Ressourcen beobachten, sogenannte Speicherlecks und ähnliches? Wenn ja wie? Kann man nicht beim Starten der Anwendung mitgeben, wieviel Speicher verwendet werden darf? Ich versuche lediglich die Anwendung ziemlich konstant auf einem Level (RAM) zu halten, um irgendwann nicht den Server "vor die Wand zu fahren".

          Gruß

          Sasch

          Comment


          • #6
            Meiner Ansicht nach müßten mit der Freigabe des Forms,<br>
            auch sämtliche zum Form gehörige Elemente des Forms<br>
            selbständig beseitigt werden. Sie wurden ja im Zusammenhang mit dem Form<br>
            erzeugt.<br>
            <br>
            <pre>
            public class frmFShow : System.Windows.Forms.Form
            {
            .
            .
            .

            //meine Klasse, in der das jeweilige Vorschaubild geaden wird
            private ClImaging Img = new ClImaging();
            .
            .
            .
            }
            </pre>
            Also wenn es die Instanz von frmFShow nicht mehr gibt, wie soll<br>
            ich dann Img noch benutzen wollen?<br>
            <br>
            MfG<br>
            Ull

            Comment

            Working...
            X