我们希望提前将.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 (请参阅下面的答案).
| 归档时间: |
|
| 查看次数: |
1592 次 |
| 最近记录: |