Wenn ich den folgenden Code:Leckt System.Diagnostics.EventLog Speicher?
static void Main(string[] args)
{
if (!System.Diagnostics.EventLog.SourceExists("eventSource"))
{
System.Diagnostics.EventLog.CreateEventSource("eventSource", "");
}
System.Diagnostics.EventLog eventLog = new System.Diagnostics.EventLog();
eventLog.Source = "eventSource";
eventLog.Log = "";
for (int i = 0; i < 10000; i++)
{
Thread.Sleep(100);
eventLog.WriteEntry("test", EventLogEntryType.Information);
//I also tried the static method, the program still leaks
//System.Diagnostics.EventLog.WriteEntry("eventSource", "test", EventLogEntryType.Information);
}
Console.ReadKey();
}
Der Speicherverbrauch um 1MB beginnt, sondern steigt sehr schnell und nicht zu stoppen. Warum ?
Haben Sie Ihre Schleife reduzieren, um zu sehen, was passiert, wenn Ihr Programm geht für Schlüssel einlesen? – Sebastian
Die Tatsache, dass die Speichernutzung ansteigt, bedeutet nicht unbedingt, dass Sie Speicher "verlieren", sondern nur, dass Sie viel davon verwenden. Ein Speicherleck tritt auf, wenn die Nutzung nicht wieder nachlässt, nachdem Sie Ihre Arbeit beendet und weitergegangen sind, ohne Ihre Objekte ordnungsgemäß zu entsorgen (http://madgeek.com/articles/leaks/leaks.en.html). Nachdem Sie dies getan haben, sollten Sie Ihr EventLog nach der Verwendung disposieren() und dann einige (unbestimmte) Zeit warten, bis GarbageCollector seine Sache macht. – Arie
Eigentlich habe ich dieses Leck in einem Windows-Dienst, und das Leck tritt nur auf, wenn ich das EventLog benutze. Der obige Code ist ein Versuch, das Leck zu reproduzieren. @Sebastian mit 100 Schleifen, der Speicherbedarf auf einem hohen Niveau bleiben. – gobes