可能的重复:
在C++中,有没有办法强制进程的WorkingSet为1GB?
我们希望提前将 .NET 进程的工作集增加到 1GB,以避免页面错误。
有没有办法在.NET 中做到这一点?
Update
不幸的是,即使我们打电话给设置进程工作设置大小Ex,垃圾收集无论如何都会修剪工作集,绕过 MinWorkingSet(请参见下图中的“Automatic GC.Collect()”)。
在下图中,有没有办法将进程WorkingSet(绿线)锁定为1GB,以避免在向进程分配新内存时出现页面错误(红线)峰值?
这太棒了,因为每次发生页面错误时,都会阻塞线程 250us,这会严重影响应用程序性能。
![enter image description here](https://i.stack.imgur.com/Hzldv.png)
Update
引用自:“Windows via C/C++,第五版,Jeffrey Richter (Wintellect)”
单个进程对 SetProcessWorkingSetSize 的调用将被忽略
除非该进程只是试图清空其工作集。设置
此限制,请在中指定 JOB_OBJECT_LIMIT_WORKINGSET 标志
LimitFlags 成员。
本书暗示设置WorkingSet 的唯一方法是将进程分配给作业对象并设置JOB_OBJECT_LIMIT_WORKINGSET 和MinimumWorkingSetSize。
Update
SetProcessWorkingSetSizeEx 与软页面错误完全无关。它仅指硬页面错误,因为它阻止当前工作集中的内存被调出到硬盘驱动器。
Update
事实证明,增加工作集的唯一方法是使用极其专业的运行 .NETCLR Host用 C++ 编写(请参阅下面我的答案)。
为了实现你想要的,你需要调用/pinvoke设置工作集大小Ex最小 1 GB(第二个参数)并且QUOTA_LIMITS_HARDWS_MIN_ENABLE
作为第四个参数,它确保即使在系统的“高内存压力”条件下工作集大小也不会低于您给出的最小值。
系统行为还取决于调用者的权限,取决于操作系统版本等,您可能需要SE_INC_WORKING_SET_NAME
and/or SE_INC_BASE_PRIORITY_NAME
!
“在幕后”使用这些 API 的另一个(更好的)选项是 .NET 包装器,您可以找到here.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)