c# Webdienst => memory leak ?
-
hallo,
ich habe letztens einen kleinen windows-Service in c# geschrieben der Kurznachrichten in der DB aktualisiert/hinzufügt (mittels xml-Dateien).
Das Problem dabei ist nun, dass sich der dienst öfters mal (alle paar tage?) aufhängt - ohne ersichtlichen grund.
Der Dienst erstellt ein System.Timers.Timer Objekt, welches (alle 60 sek) eine Funktion aufruft. Vielleicht ist das ja schon die Fehlerquelle. Ist das so "praktikabel" mit dem timer-objekt im dienst?
ausserdem wird der speicherverbruch des dienstes (prozess unter task-manager) langsam raufgezählt. d.h. anfangs ist der bei z.b. 20.904K und nach 30 min bei 21.600K. Aber ich bin mir eigentlich sicher, dass ich jedes (mittels new erstellte) Objekt wieder lösche (wenn vorhanden =>.Dispose(); dann auf null setzen).
Mit kommt es aber auch so vor, als ob sich der Speicherverbrauch nach einiger zeit "einpendelt".Gibt es eine "trick" bzw gute methode um rauszufinden warum der dienst nicht weiterläuft? (z.b. Timer-Objekt abgeraucht ??)
ausserdem stört micht der "speicherverbrauch". wie können (unter c#) noch memory-leaks entstehen; ich dachte die garbage-collection löscht austomatisch nicht mehr referenzierte obejkte;
-
Tachyon76 schrieb:
ausserdem stört micht der "speicherverbrauch". wie können (unter c#) noch memory-leaks entstehen; ich dachte die garbage-collection löscht austomatisch nicht mehr referenzierte obejkte;
Garbage Collection ist teuer. Solch eine Speicherbereinigung erfolgt daher nicht sofort. Eigentlich ist das System gut ausgependelt, Du brauchst in den gemanagten Ressourcen nichts unternehmen. Freigabeprobleme sollten nur dann entstehen wenn diese Komponenten unmanaged Ressourcen besitzen und diese nicht freigegeben werden bzw Du alle diese Objekte irgendwo noch festhälst, nicht mehr benutzte Objekte nicht verwaisen. Aber das scheint doch nicht Dein Problem zu sein, wenn der Speicherverbrauch sich "einpendelt".
-
die garbage-collection löscht austomatisch nicht mehr referenzierte obejkte;
Das ist korrekt. Jedoch eben nur wenn sie nicht mehr ref. sind. Bis .NET 2.0 muss man z.B. im Zusammenhang mit events aufpassen, da der Event Mechanismus beide Seiten (Consumer und Producer) "am Leben" hält. Dies hat mit dem Weak Event Pattern geändert. (http://www.codeproject.com/KB/architecture/observable_property_patte.aspx)
Das hier könnte ein guter Einstieg sein.
http://www.codeproject.com/KB/dotnet/Memory_Leak_Detection.aspxAuch Tools wie der Performance Monitor von Windows sind eine Hilfe.
Simon
-
Du hast in einem Webservice einen Timer?
Für der IIS dann den Timer regelm. aus?