Подтвердить что ты не робот

Ограничение памяти процесса с помощью MaxWorkingSet

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

        }
    }
}

Я ожидаю исключения OutOfMemory после достижения предела 2mb, но ничего не происходит. Если я открою диспетчер задач, я увижу, что объем памяти, который использует мое приложение, постоянно растет без каких-либо ограничений.

Что я делаю неправильно? Спасибо заранее

4b9b3361

Ответ 1

Нет, это не ограничивает объем памяти, используемой процессом. Это просто обертка вокруг SetProcessWorkingSetSize, которая a) является рекомендацией, и b) ограничивает рабочий набор процесса, который представляет собой объем физической памяти (ОЗУ), который этот процесс может потреблять.

Это абсолютно не вызовет исключение из памяти в этом процессе, даже если оно выделяет значительно больше, чем то, что вы задали для свойства MaxWorkingSet.

Существует альтернатива тому, что вы пытаетесь сделать - API-интерфейс объекта Win32. Там управляемая оболочка для Codeplex (http://jobobjectwrapper.codeplex.com/), на которую я вносил вклад. Это позволяет вам создать процесс и ограничить объем памяти, который может использовать этот процесс.