我们希望提前将 .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 标志。
这本书暗示设置工作集的唯一方法是将进程分配给作业对象并设置JOB_OBJECT_LIMIT_WORKINGSET和MinimumWorkingSetSize。
更新
SetProcessWorkingSetSizeEx 与软页面错误完全无关。它仅指硬页面错误,因为它防止当前工作集中的内存被分页到硬盘驱动器。
更新
事实证明,增加 WorkingSet 的唯一方法是使用用 C++ 编写的极其专业的CLR 主机运行 .NET (请参阅下面的答案)。