[CSharp.net] Speicherproblem
stefan@stmu-net.de
csharp.net at glengamoi.com
Tue, 14 Dec 2004 15:14:52 +0100
This is a multi-part message in MIME format.
----=_NextPart_000_000B_497DE203.9CAE4C40
Content-type: text/plain; charset="US-ASCII"
Hallo,
ich schreibe gerade ein WindowsService der eine JobListe aus einer SQL Datenbank abarbeitet. Trift
ein neuer Job ein, so soll dieser ein Backup von einem Gerät machen. Die gesicherten Daten
werden dann in eine Tabelle der Datenbank geschrieben. Dies funktioniert alles wunderbar.
So nun zu meinem Problem.
Während der Dienst ein Backup Job abarbeitet benötigt dieser immer 50 - 200 MB an
Speicher.
Ich habe herrausbekommen, das die exzessive Speichernutzung dann anfängt, wenn ich die Dateien
(als Byte-Array) in die Datenbank (über eine Stored Procedure) schreibe.
(Dazu habe ich ein File-Objekt, in dem die Datei als Byte-Array gelesen und dann mit diversen
Eigenschaften in die DB geschrieben wird. Diese Objekte sind weder global noch in einer Collection
gespeichert und werden immer nur dann erzeugt wenn diese auch in die DB geschrieben oder aus dieser
gelesenen werden.)
Meine Probedateien sind alle nicht besoders groß (einige ca. 200kB und eine 5MB groß).
Schon alleine deswegen sind die beanspruchten Speichergrößen nicht gerechtfertigt.
Das der Dienst, während er einen Job bearbeitet, soviel Speicher benötig ist eigendlich
zu verkraften, aber er gibt diesen nicht wieder Frei wenn der Thread, in dem der Job abgearbeitet
wird, sich beendet. Selbst wenn man andere Programme startet, ändert sich nichts an der
Auslastung des Speichersbereichs (für diesen Dienst). (Dieser müsste doch dann eigentlich
freigegeben werden?!) Erst wenn ein weiterer Job gestartet wird, verändert sich die
Speichernutzung und bleibt danach wiederrum unverändert, je nachdem wieviel Speicher die
letzte Datei benötigte.
Ich weiß das die Arbeit des Garbage Collectors nicht vorhersagbar ist, aber dennoch sollte man
meinen das auf einem System mit 256 MB Ram (minus Grafikspeicher) dieser ab und zu mal in Funktion
tritt. Aber der Dienst bleibt unverändert bei der selben Speichernutzung stehen. Ausserdem
weiß ich das es nicht besonders effektiv ist den GC zu "Befehlen" seine Arbeit zu verrichten.
(Performancegründe etc.)
Kann es sein das ich grundlegende Sachen vergesse?
Danke und Gruß,
Stefan M.
----=_NextPart_000_000B_497DE203.9CAE4C40--