【问题标题】:Limiting process memory with MaxWorkingSet使用 MaxWorkingSet 限制进程内存
【发布时间】:2011-06-18 15:12:04
【问题描述】:

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 异常,但没有任何反应。如果我打开任务管理器,我可以看到我的应用程序使用的内存量不断增长,没有任何限制。

我做错了什么? 提前致谢

【问题讨论】:

    标签: c# .net memory-management


    【解决方案1】:

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

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

    除了您尝试做的事情之外,还有一个替代方案——Win32 Job Object API。 Codeplex (http://jobobjectwrapper.codeplex.com/) 上有一个托管包装器,我对此做出了贡献。它允许您创建一个进程并限制该进程可以使用的内存量。

    【讨论】:

    • 非常感谢!在这种情况下还有一些问题:)。什么会导致工作集使用量显着增长?当它达到极限时会发生什么?会是 OutOfMemory 异常还是其他?
    • 进程分配内存时,会消耗工作集(RAM)。但是,如果在其他进程/系统组件中需要 RAM,则某些进程的工作集可能会被调出到磁盘。如果您使用 Job Objects 并遇到限制,则该过程将终止,您会收到发生这种情况的通知。
    • 其实这是错误的。工作集是进程预计在工作集中需要多少最近使用的内存,它影响 L1/L2,而不是 RAM。何时从 WS 中逐出取决于操作系统内核。工作集是您希望在处理过程中重复的 LRU 内存,例如,小的外观需要很少的 WS,而大的循环需要更多。设置工作集不会影响进程将使用的 RAM 量。
    • @Tedd Hansen:对不起,这是不正确的。 SetProcessWorkingSetSize 确切影响进程将使用的 RAM 量。请参阅文档msdn.microsoft.com/en-us/library/ms686234.aspx - 正如我所指出的,这是对 Windows 的建议,它最终决定将哪些页面保留在 RAM 中,但该建议与 L1/L2 缓存无关,仅与 RAM 与页面文件有关。
    • 嗨。我在链接中看到了代码,发现它很有帮助。但是你在哪里限制进程使用的 RAM 量。我还有一个用例,我们想限制由该进程启动的任何进程使用的 RAM 量。您能告诉我们如何实现吗?
    猜你喜欢
    • 2023-04-05
    • 2016-10-13
    • 2011-01-24
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2012-02-27
    相关资源
    最近更新 更多