c# - 使用 EmptyWorkingSet 有什么副作用?

标签 c# memory-management side-effects

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

[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 等等,所以我在想这是否没有不良副作用?

最佳答案

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

在如此低的级别上干扰系统充满了危险:特别是,Explorer 页面错误可能会减慢系统速度,导致奇怪的死锁开始抬头。最好将此留给 Windows,特别是对于您未编写的其他程序。

您可能会发现更有效地理解为什么您自己的程序需要这么多内存。也许某处有泄漏?

关于c# - 使用 EmptyWorkingSet 有什么副作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1812018/

相关文章:

python - Pytest:模拟具有不同 side_effect 的相同方法的多次调用

C# ListBox 从文本文件导入时崩溃

c# - 如何处理具有相同父级的不同事件处理程序?

c++ - QDialog 删除它的 QLayout?

c - 父进程和子进程的内存映射文件问题

Android 应用程序内存不足错误,尝试使用 88kb 图像

android - 更改 Android Play/Market 中现有应用的过滤器和要求的副作用

C# WPF ComboBox - 排除绑定(bind)数据的最后一行(或空格)(从 Microsoft Access 绑定(bind))

c# - 我可以在未绑定(bind)的 DataGridView 中设置最大行数吗

java - 如何避免副作用?