我正在使用下面的代码释放一些正在运行的程序的内存,因为我自己的程序需要大量内存资源才能更快地运行。
[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)
{
...
}
}
}
它似乎工作正常,我能够将某些程序(如资源管理器)的内存使用量从100,000 Kb降低到2,000 Kb。这很不错,但这样做有副作用吗? 一些商业软件也使用这个,比如Yamicsoft Vista / Xp管理器和Firefox优化器等等,所以我在想,如果这没有不好的副作用,或者在那里?
答案 0 :(得分:2)
我怀疑副作用是其他程序的表现 - 当进程需要时,系统会将调用的页面调回EmptyWorkingSet()
。
在如此低的水平上与系统混乱充满了危险:特别是,资源管理器页面错误可能会使系统速度降低到奇怪的死锁开始使他们丑陋的头部发挥作用的程度。最好把它留给Windows,特别是对于你没写的其他程序。
您可能会发现理解为什么您自己的程序需要如此多的内存会更有效。或许某处有泄漏吗?
答案 1 :(得分:1)
就个人而言,我没有处理过这个问题。似乎有点'危险':P
无论如何,你可能会发现一些有用的文章:
Performance Issues with EmptyWorkingSet
Memory management - forcing a process to free it's memory