使用MaxWorkingSet限制进程内存

时间:2011-01-31 14:33:14

标签: c# .net memory-management

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)
        {

        }
    }
}

在达到2mb的限制后,我期待OutOfMemory异常,但没有任何反应..如果我打开任务管理器,我可以看到我的应用程序使用的内存量不断增长而没有任何限制。

我做错了什么? 提前致谢

1 个答案:

答案 0 :(得分:11)

不,这不会限制进程使用的内存量。它只是SetProcessWorkingSetSize的包装,其中a)是推荐,b)限制进程的工作集,即物理内存的数量( RAM)这个过程可以消耗。

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

您可以尝试使用Win32作业对象API。在我提供的Codeplex(http://jobobjectwrapper.codeplex.com/)上有一个托管包装器。它允许您创建进程并限制此进程可以使用的内存量。