Memory Leak in FileSystemWatcher?
-
Hallo,
ich schreibe gerade ein Programm, das die Änderungen von Dateien überwacht. Dazu ist ja die Klasse FileSystemWatcher da. Jedoch erhöht sich der Speicherverbrauch meines Programmes langsam aber konstant immer um 8 KB. Da das Programm sehr lange laufen soll, ist das etwas unpraktisch.
Mache ich etwas falsch oder handelt es sich hier um einen Bug?using System; using System.IO; using System.Threading; namespace FileWatcher { class Program { static void Main(string[] args) { FileSystemWatcher w = new FileSystemWatcher("C:\\"); w.IncludeSubdirectories = true; w.Changed += new FileSystemEventHandler(w_Changed); w.EnableRaisingEvents = true; while(true) { Thread.Sleep(Timeout.Infinite); } } static void w_Changed(object sender, FileSystemEventArgs e) { } } }
System ist Windows Vista Home Premium mit .NET Framework 3.5
Ich hoffe, jemand weiß Rat.
-
Der GC räumt auf wenn er dazu lust und zeit hat.
-
Und 8 KB ist ja gar nichts. Wenn du zig GB RAM haben solltest, dann sieht der GC sich gar nicht genötigt überhaupt aufzuräumen.
-
Vielen Dank erstmal für eure Antworten.
Das Problem ist aber, dass der GC scheinbar nie aufräumen will. Ich habe testweise jede Sekunde GC.Collect aufgerufen und trotzdem ist der Speicherverbrauch nach ca. 10 Minuten um 1 MB angestiegen. Das ist natürlich nicht viel, aber auf die Dauer summiert sich das schon, zumal das Programm ja wie gesagt lange (auf einem Server) laufen soll.
-
Wenn der GC nicht aufräumt, wirst Du irgendwo noch eine Referenz auf das Objekt halten. Der GC räumt nur Objekte auf, die keinerlei Referenzen mehr haben.
-
Es wird nur der oben gezeigte Code verwendet. Allerdings mit "Thread.Sleep(1000); GC.Collect();" für den Garbage Collector.
-
Der Ants Profiler von RedGate liefert ein Memoryprofiler mit. Damit kannst Du mal schauen wohin der Speicher verschwindet. (Für das .net CF gibts das von MS von haus aus. Ob es da was fürs volle Framework gibt weiß ich nicht. Vllt. kennt jemand eine alternative zum RedGate Ants)
namespace FileWatcher { class Program { static void Main(string[] args) { FileSystemWatcher w = new FileSystemWatcher("C:\\"); w.IncludeSubdirectories = true; w.Changed += new FileSystemEventHandler(w_Changed); w.EnableRaisingEvents = true; for (int i = 0; i < 100000; i++ ) { Thread.Sleep(1000); } } static void w_Changed(object sender, FileSystemEventArgs e) { } } }
Bleibt bei mir an sich stabil. Gelegentlich ändert sich mal was - abhängig von dem was grad auf dem Laufwerk passiert. (Wobei ich das auch grad nicht mehr hinbekomme.)