Hallo Leute,
Inventor und die Speicherbelegung war schon oft das Thema hier, jedoch bin ich mir nicht sicher, ob jemals die Ursache für das komische Speicherverhalten bei Inventor gefunden wurde, so schreibe ich mal meine Erfahrung, die ich heute gemacht habe, nieder.
Ich arbeite momentan an einer .NET Applikation, und während den Tests sind mir ganz komische Sachen bezüglich der Speicherbelegung aufgefallen. Die Applikation hatte schon beim Start 30MB belegt, und nach einigen Jobs ging der belegte Speicher jenseits der 100MB Grenze. Ich habe versucht meinen Code zu optimieren indem ich den benötigten Speicher manuell freigegeben habe, jedoch ohne Erfolg. Dass .NET durch GarbageCollection das selber macht ist mir klar, jedoch diese Werte des belegten Speicher, die ich bekommen habe, waren so willkürlich, dass ich nachforschen musste. Dabei bin ich auf einen interessanten Artikel gestoßen. Da wird erklärt, warum dieses Verhalten nach der Minimierung einer Anwendung auftritt, und auch welcher API Befehl (SetProcessWorkingSetSize) nötig ist, um den reservierten jedoch nicht gebrauchten Speicher frei zu geben.
.NET Framework reserviert den s.g. WorkingSet Speicher, der zur Verfügung steht, wird jedoch nicht benutzt. Dieser Speicher wird von Framework automatisch freigegeben, sobald ein anderer Prozess den Speicher braucht. Also lange Rede kurzer Sinn, der Wert der in dem TaskManager angezeigt wird, ist nicht der wirkliche Speicher den die Anwendung benutzt. So ist der Einsatz von FreeMem und anderen Tools um den Speicher freizugeben völlig unnötig, denn dieser Speicher ist nicht wirklich belegt und steht zur Verfügung, sobald er benötigt wird, so sollte man die Speicherverwaltung wirklich dem Betriebssystem überlassen.
Um dieses Phänomen zu testen, muss Inventor einfach minimiert werden. Die Werte die bei mir raus kommen:
Inventor nach dem Start: 200MB
Inventor minimiert: 4MB
Inventor wieder maximiert: 8MB
So ist der Wert von 200MB nicht wirklich relevant, und man sollte sich davon nicht blenden lassen.
Ich habe die API Funktion SetProcessWorkingSetSize in ein einfaches Makro implementiert. Wenn man die Funktion ResetWorkingSetSize aufruft, wird der gleiche Effekt hervorgerufen (die 2 Deklarationen bitte am Modulanfang, oder gleich ein neues Modul hinzufügen und den Code reinkopieren):
Code:
Declare Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal hProcess As Long, ByVal dwMinimumWorkingSetSize As Long, ByVal dwMaximumWorkingSetSize As Long) As Long
Declare Function GetCurrentProcess Lib "kernel32.dll" () As LongSub ResetWorkingSetSize()
Call SetProcessWorkingSetSize(GetCurrentProcess, -1, -1)
End Sub
So, und nun mache ich mal beruhigt weiter
Schönen Sonntag noch!
------------------
Grüße Igor
FX64 Software Solutions
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP