Autor Beitrag
m.keller
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mo 13.01.14 11:41 
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:


ausblenden volle Höhe 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
{
    /// <summary>
    /// Represents a foo class.
    /// </summary>
    public class Foo : IDisposable
    {
        /// <summary>
        /// Contains, whether this instance has been
        /// disposed yet.
        /// </summary>
        private bool _isDisposed;

        /// <summary>
        /// Finalizes this instance.
        /// </summary>
        ~Foo()
        {
            // Dispose this instance.
            this.Dispose(false);
        }

        /// <summary>
        /// Disposes this instance.
        /// </summary>
        /// <param name="isDisposeByUser"><c>true</c> whether
        /// disposing is called by the user; <c>false</c>
        /// otherwise.</param>
        private void Dispose(bool isDisposeByUser)
        {
            // If the disposing is called by the user,
            // managed resources may be cleaned up, too.
            if (isDisposeByUser)
            {
                // TODO gr: Clean up any managed resources.
                //          2008-01-02
            }

            // TODO gr: Clean up any unmanaged resources.
            //          2008-01-02

            // Suppress execution of the finalizer for
            // this object.
            GC.SuppressFinalize(this);

            // Define this instance as disposed.
            this._isDisposed = true;
        }

        /// <summary>
        /// Dispose this instance.
        /// </summary>
        public void Dispose()
        {
            // If this instance has been disposed, throw an
            // exception.
            if (this._isDisposed)
            {
                throw new ObjectDisposedException(
                    this.ToString());
            }

            // Dispose this instance.
            this.Dispose(true);
        }
    }
}


und in Main
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
using (GoloRoden.GuideToCSharp.Foo foo = new GoloRoden.GuideToCSharp.Foo())
            {
                // TODO gr: Use the object.
                //          2008-01-02
            }
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 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.

Für diesen Beitrag haben gedankt: m.keller