有没有办法将进程的当前WorkingSet扩展到1GB?

Con*_*ngo 7 .net c# .net-4.0

可能重复:
有没有办法强制进程的WorkingSet在C++中为1GB?

我们希望提前将.NET进程的WorkingSet增加到1GB,以避免页面错误.

有没有办法在.NET中执行此操作?

更新

不幸的是,即使我们调用SetProcessWorkingSetSizeEx,垃圾收集仍会修改工作集,绕过MinWorkingSet(参见下图中的"自动GC.Collect()").

在下面的图片中,有没有办法将进程WorkingSet(绿线)锁定为1GB,以避免在将新内存分配到进程时出现页面错误(红线)的峰值?

这很棒的原因是,每次发生页面错误时,它都会阻塞250us的线程,这会严重影响应用程序性能.

在此输入图像描述

更新

引用自:"Windows via C/C++,Fifth Edition,Jeffrey Richter(Wintellect)"

除非进程只是尝试清空其工作集,否则将忽略单个进程对SetProcessWorkingSetSize的调用.要设置此限制,请在LimitFlags成员中指定JOB_OBJECT_LIMIT_WORKINGSET标志.

本书暗示设置WorkingSet的唯一方法是将进程分配给作业对象并设置JOB_OBJECT_LIMIT_WORKINGSET和MinimumWorkingSetSize.

更新

SetProcessWorkingSetSizeEx与软页面错误完全无关.它仅指硬页面错误,因为它可以防止当前WorkingSet中的内存被分页到硬盘驱动器.

更新

事实证明,增加WorkingSet的唯一方法是使用用C++编写的极其专业的CLR主机来运行.NET (请参阅下面的答案).

Con*_*ngo 2

我们可以找到的增加 .NET 下进程的工作集以减少软页面错误的唯一方法是在自定义CLR Host下运行整个 .NET 应用程序。这是一个不简单的练习,需要大约 800 行自定义编写的相当密集的 C++ 代码。C++ 代码拦截 .NET 对 Win32 内存管理方法的调用,改变 .NET 运行时的行为,使其不会像通常那样积极地释放内存。

这会在应用程序启动时引发所有软页面错误,因此在正常应用程序执行期间,.NET 应用程序中的软页面错误数量几乎降至零。

这意味着应用程序可能会占用大量内存,但运行速度更快。换句话说,我们正在牺牲内存使用来提高实时性能。