7

我正在使用下面的代码来释放一些正在运行的程序的内存,因为我自己的程序需要大量内存资源才能更快地运行。

[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 Optimizer 等等,所以我在想这是否没有不好的副作用或者是否存在?

4

2 回答 2

2

我怀疑副作用将是那些其他程序的性能 -EmptyWorkingSet()当进程需要它们时,系统会将调用换出的页面带回。

在如此低的级别上搞乱系统是充满危险的:特别是,资源管理器页面错误可能会减慢系统速度,以至于奇怪的死锁开始出现在他们丑陋的头脑中。最好将其留给 Windows,特别是对于您未编写的其他程序。

你可能会发现理解为什么你自己的程序需要这么多内存更有效。是不是有什么地方漏水了?

于 2009-11-28T08:59:57.757 回答
1

就个人而言,我没有处理过这个问题。似乎有点“危险”:P

无论如何,一些您可能会觉得有帮助的文章:
EmptyWorkingSet 内存管理的性能问题
- 强制进程释放它的内存

于 2009-11-28T09:02:16.247 回答