2009-11-28 11 views
7

Korzystam z poniższego kodu, aby zwolnić pamięć w niektórych uruchomionych programach, ponieważ mój własny program potrzebuje dużych zasobów pamięci, aby działać szybciej.Jakie są skutki uboczne używania EmptyWorkingSet?

[DllImport("psapi.dll")] 
public static extern bool EmptyWorkingSet(IntPtr hProcess); 

public FreeMem(string programName){ 

     EmptyWorkingSet(Process.GetCurrentProcess().Handle); 
     foreach(Process process in Process.GetProcesses(programName)) 
     { 
      try 
      { 
       EmptyWorkingSet(process.Handle); 
      } 
      catch (Exception) 
      { 
       ... 
      } 
     } 
} 

Wydaje się, że działa dobrze, udało się obniżyć zużycie pamięci niektórych programów, takich jak odkrywcy od 100000 Kb dół do 2000 Kb. To całkiem dobrze, ale czy ma to jakiś niepożądany efekt? Niektóre komercyjne programy używają tego również jako menedżer Yamicsoft Vista/Xp i Firefox Optymalizator, aby wymienić tylko kilka, więc myślę, że to nie ma żadnych złych efektów ubocznych czy jest?

Odpowiedz

2

Podejrzewam, że efektem ubocznym będzie działanie tych innych programów - system przyniesie strony zamienione przez połączenie do EmptyWorkingSet() z powrotem, gdy proces ich potrzebuje.

Wiadomości z systemem na tak niskim poziomie są obarczone niebezpieczeństwem: w szczególności błędy strony Eksploratora mogą spowolnić system do momentu, w którym dziwne zakleszczenia zaczynają wychylać swoje brzydkie głowy. Najlepiej pozostawić to Windowsowi, w szczególności dla innych programów, których nie pisałeś.

Może okazać się, że bardziej efektywne będzie zrozumienie, dlaczego twój własny program wymaga tak dużo pamięci. Czy jest gdzieś jakiś wyciek?

+0

może masz rację. Spróbuję znaleźć sposób na zoptymalizowanie własnego programu zamiast zoptymalizować inne programy i usunąć EmptyWorkingSet, jeśli jest to niebezpieczne. – murasaki5