Speicherleck
-
1. Mit dem MemProfiler solltest Du *zwei* Speicherstände vergelichen... nur dadurch kannst DU was sinnvolles erhalten...
Lass also Dein Program mal 10 min. laufen und mache den ersten MemDump. Dann lass es mal 2h laufen und machen den zweiten MemDump. Dann werden automatisch die beiden Stände verglichen und Du siehst, was in der Zeit angestiegen ist.
2. Deine Beobachtungen bzgl. "Speicherleck" sind wertlos. Du kannst ein Speicherleck nur nachweisen, wenn Du das "Private Bytes" *Deines* Proesses beobachtest. Es spielt keine Rolle, was die anderen Prozesse machen!
3. Wenn Du eh nur die laufenden Prozesse aufliesten lassen willst, dann rate ich Dir dazu dies über die *native* Methoden zu machen; die sind wesentlich performanter und machen nicht so viel "blödsinn" wie die .NET Implementierung (welche via PerformanceCounter implemetiert ist).
http://msdn.microsoft.com/en-us/library/ms682629
-
@Fragesteller:
Ich würde ev. doch nochmal der IOException nachgehen. Immerhin bis Du weisst warum und wann sie auftritt.Simon
-
Genau genommen ist das hier nur ein Ausschnitt aus dem eigentlichen Programm, ein Test, bei dem ich auch die Timer einzeln laufen lassen habe.
Wie kann ich den StreamReader oder DateTime disposen?
Um die Prozessliste zu erhalten, lege ich doch eigentlich gar keine Instanz der Prozessklasse an?
Aber ich habe den Code hier mal geändert:private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) { listBox1->Items->Clear(); Process ^prozesse=gcnew Process(); for each(Process ^element in prozesse->GetProcesses()) listBox1->Items->Add(element->ProcessName); prozesse->Close(); }
Es hat sich aber nichts wirklich geändert. Die Heaps werden dennoch weiter belastet, obwohl das doch "short Life sein müsste, oder?
Was muss ich genau zum Disposen für Process aufrufen?
prozesse->Dispose(true);
geht nicht.
-
Sollte ich das mit der API auch für DateTime machen?
-
Noch ne Frage, wo finde ich im MemProfiler die Private Bytes Auflistung?
Ist das damit gemeint:
Registerkarte - Types - Live Bytes - Total? New ? oder Max?
Was ist mit den Werten von Gen0 - Gen2 in Real-Time? Ist es unbedeuten, dass diese dauernt erhöht werden?
-
Hier ein Bsp. um die Prozesse zu ermitteln und mittels Dispose() (durch delete aufgerufen) wieder freigegeben:
void f() { array<Process^>^ processes = Process::GetProcesses(); for each (Process^ process in processes) { listBox1->Items->Add(process->ProcessName); delete process; // ruft process->Dispose(); auf } }
Bei DateTime musst Du kein Dispose() aufrufen.
Jedoch kannst Du mal den Tip von Jochen befolgen und EnumProcesses(..) benutzen.
Simon
-
Um überhauot festustellen ob man ein Leck hat, ist im Folgenden Link
http://memprofiler.com/screenshots.aspx
in Screen "Native Memory" der "Private" relevant...