C# 使用MaxWorkingSet限制进程内存

C# 使用MaxWorkingSet限制进程内存,c#,.net,memory-management,C#,.net,Memory Management,MSDN: public IntPtr MaxWorkingSet{get;set;} 获取或设置允许的最大值 关联对象的工作集大小 过程属性值:最大值 中允许的工作集大小 进程的内存,以字节为单位 所以,据我所知,我可以限制进程可以使用的内存量。我试过了,但是运气不好 一些代码: public class A { public void Do() { List<string> guids = new List<string>();

MSDN:

public IntPtr MaxWorkingSet{get;set;}

获取或设置允许的最大值 关联对象的工作集大小 过程属性值:最大值 中允许的工作集大小 进程的内存,以字节为单位

所以,据我所知,我可以限制进程可以使用的内存量。我试过了,但是运气不好

一些代码:

public class A
{
    public void Do()
    {
        List<string> guids = new List<string>();
        do
        {
            guids.Add(Guid.NewGuid().ToString());
            Thread.Sleep(5);
        } while (true);
    }
}


public static class App
{
    public static void Main()
    {
        Process.GetCurrentProcess().MaxWorkingSet = new IntPtr(2097152);
        try
        {
            new A().Do();
        }
        catch (Exception e)
        {

        }
    }
}
公共A类
{
公营部门
{
List guids=new List();
做
{
Add(Guid.NewGuid().ToString());
睡眠(5);
}虽然(正确);
}
}
公共静态类应用程序
{
公共静态void Main()
{
Process.GetCurrentProcess().MaxWorkingSet=new IntPtr(2097152);
尝试
{
新的A().Do();
}
捕获(例外e)
{
}
}
}
我期待在达到2mb限制后出现OutOfMemory异常,但什么也没有发生。。如果我打开任务管理器,我可以看到我的应用程序使用的内存量在不断增长,没有任何限制

我做错了什么?
提前感谢

不,这不会限制进程使用的内存量。它只是一个包装,围绕着
SetProcessWorkingSetSize
,a)是一个建议,b)限制进程的工作集,这是该进程可以消耗的物理内存(RAM)量

它绝对不会在该过程中导致内存不足异常,即使它的分配远远超过您设置的
MaxWorkingSet
属性


除了您尝试执行的操作之外,还有一种替代方法--Win32作业对象API。在Codeplex()上有一个托管包装器,我对此做出了贡献。它允许您创建一个进程并限制该进程可以使用的内存量。

非常感谢!本例中还有一些问题:)。什么会导致工作集使用量的显著增长?当它达到极限时会发生什么?它是OutOfMemory异常还是smth else?当进程分配内存时,它可能会消耗工作集(RAM)。然而,如果在其他进程/系统组件中需要RAM,那么一些进程的工作集可能会被分页到磁盘。如果您使用作业对象并运行到限制,则进程将终止,并且您可以收到发生此情况的通知。实际上,这是错误的。工作集是进程期望在工作集中需要多少最近使用的内存,它影响L1/L2,而不是RAM。何时从WS退出取决于操作系统内核。工作集是您希望在处理过程中重复的LRU内存,例如,小的外观需要小的WS,而大的循环需要更多的WS。设置工作集不会影响进程将使用的RAM量。@Tedd Hansen:对不起,这是不正确的
SetProcessWorkingSetSize
精确影响进程将使用的RAM量。请参阅文档--正如我所指出的,这是对Windows的建议,Windows最终决定在RAM中保留哪些页面,但该建议与L1/L2缓存无关,只与RAM和page file.Hi有关。我在链接中看到了代码,发现它很有用。但是,您在哪里限制进程使用的RAM数量呢。我还有一个用例,我们希望限制由该进程启动的任何进程所使用的RAM量。你能告诉我们如何做到这一点吗?