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?
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?