Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Speicherproblem unter .Net


Bietchiebatchie
2007-03-24, 17:26:08
Hi.

Ich hab ein Application geschrieben, die im 24-Stundenbetrieb laufen soll. Memoryleaks sind daher unerwünscht. Um das ganze unter halbwegs realen Bedingungen zu testen, hab ich einfach 25 Threads erzeugt, die in einer Endlosschleife ihrer Arbeit nachgehen. Konkret sieht der Code in der Main so aus (leicht vereinfacht natürlich):

[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

ProcessWindow processWindow = new ProcessWindow();

for (int i = 0; i < 25; i++)
{
Thread thread = new Thread((ThreadStart)delegate
{
while (true)
{
Process process = new Process(i);
// kleiner Hack, damit sichergestellt ist, dass der windowhandle erstellt ist
Thread.Sleep(3000);
processWindow.AddProcess(process);
process.Start();
processWindow.RemoveProcess(process);
}});
}

Application.Run(processWindow);
}



Problem: das Programm verbraucht nach und nach mehr Speicher.
Grundsätzlich ja kein großes Problem (dachte ich zumindest): einen vernünftigen Memoryprofiler installiert ... noch einen ... und noch einen:
* ANTS-Profiler
* Dot-Trace
* CLR Profiler
bringen alle das selbe Ergebnis: mein Programm braucht zwischen 0.5 und 1 MB (schwankt immer, da in den Prozessen ja Speicher allokiert und wieder freigegeben wird. Leider steht das im krassen Gegensatz zu dem was der Taskmanager mir sagt: nämlich mehr oder weniger konstanter Speicherzuwachs.
Da ich weder große Erfahrung mit Speicherproblemen unter .Net noch irgendeine konkrete Idee habe, wo Speicher nicht wieder freigegeben wird und die Profiler mir nichts sinnvolles liefern, bin ich mit meinem Latein doch ziemlich am Ende.
Daher die Frage:
Hat irgendjemand eine Idee, Tipp oder Hinweis, wie ich mein Problem lösen kann?

Unfug
2007-03-24, 17:36:30
Ich hatte das Problem damals das ich die entsprechenden Thread nicht auf NULL gesetzt habe.
Und ansonsten musste du den Garbage Collector zwingen den Speicheraufzuräumen, da er nur dann aufräumt, wenn dein Programm im IDLE ist.
Ich glaub ein GC.collect(); hat ausgereicht.

Bietchiebatchie
2007-03-24, 17:50:18
Wow, danke für die schnelle Antwort.
Ich hatte das Problem damals das ich die entsprechenden Thread nicht auf NULL gesetzt habe.
Das kann ich nicht, da die Threads bei mir ja immer existieren.
Und ansonsten musste du den Garbage Collector zwingen den Speicheraufzuräumen, da er nur dann aufräumt, wenn dein Programm im IDLE ist.
Ich glaub ein GC.collect(); hat ausgereicht.
:/ Ich dachte, die GC würde immer Speicher aufräumen, wenn der Speicher knapp wird... und ab und an wird die GC auch gestartet (laut Profilern sind manche Objekte in der x.ten Generation). Bei Gelegenheit muss ich mir das Thema GC unter .net wohl mal genauer anschauen...
Ich mach mal nen GC.Collect nach jedem Threaddurchlauf, mal schauen was passiert...

Gast
2007-03-24, 18:44:30
Stimmt schon so, GC springt immer von selbst an wenn der Speicher zu knapp wird.