使用MaxWorkingSet限制进程内存

And*_*rey 12 .net c# 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)
        {

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我究竟做错了什么?提前致谢

Sas*_*ein 11

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

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

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

  • @Tedd Hansen:对不起,这是不正确的.`SetProcessWorkingSetSize`完全影响进程将使用的RAM量.请参阅文档http://msdn.microsoft.com/en-us/library/ms686234.aspx - 正如我所提到的,这是对Windows的建议,最终决定在RAM中保留哪些页面,但建议没有任何内容使用L1/L2缓存,仅使用RAM与页面文件. (2认同)