2013-06-07 2 views
3

Я пытаюсь проверить обработку ошибок моего кода в условиях ограниченной памяти.Настроить ограничение памяти на CLR

Я также заинтересован в том, как производительность моего кода затрагивается в ситуациях с низкой памятью, где, возможно, GC должен работать чаще.

Есть ли способ запустить .Net-заявку (или набор тестов NUnit) с ограниченной памятью? Я знаю, что с помощью Java вы можете ограничить объем памяти, доступной JVM, - есть ли что-то подобное в .Net?

+0

Я не пишу ответа, потому что это не то, что мне приходилось делать раньше, но первым моим инстинктом было бы развернуть виртуальную машину и ограничить объем памяти, который у нее есть; таким образом, вы учитываете такие вещи, как ОС и другие приложения, которые должны быть запущены, а также ваши собственные. –

ответ

3

Это не вариант в среде CLR. Память управляется очень иначе, в .NET-процессе есть как минимум 10 различных куч. Программа .NET может использовать все пространство виртуальной памяти, доступное в процессе Windows, без ограничений.

Самый простой способ - просто выделить память при запуске программы. Вы должны быть немного осторожны, вы не можете проглотить слишком много за один глоток, адресное пространство фрагментировано из-за него, содержащего сочетание кода и данных по разным адресам. Память выделяется из промежутков между ними. Чтобы помещать серьезную вмятину в доступное адресное пространство, вам нужно выделить не менее гигабайта, и это невозможно с одним распределением.

Так просто использовать цикл, чтобы выделить более мелкие куски, скажем, один мегабайт в то время:

private static List<byte[]> Gobble = new List<byte[]>(); 

    static void Main(string[] args) { 
     for (int megabyte = 0; megabyte < 1024; megabyte++) 
      Gobble.Add(new byte[1024 * 1024]); 
     // etc.. 
    } 

Обратите внимание, что это очень быстро, распределенный адресное пространство только зарезервирован и не занимает какой-либо ОЗУ.

+0

Возможно, это работает, но сделает всю машину непригодной для использования. Пейджинговое безумие, другие процессы сбой, ... Chrome, например, сбой сразу после исчерпания лимита фиксации. – usr

+0

@usr - вы не обратили внимание на последний абзац. Просто попробуйте это. –

+0

Это все еще скидки от ограничения на перенос Windows, потому что Windows обещает вашему процессу этот объем памяти. Вы все еще исчерпываете ресурс уровня ОС. Windows никогда не перегружает память. – usr

1

Вы можете зачислить свой процесс в объект задания Windows. Вы можете установить пределы памяти (и другие) для задания. Это самый чистый и единственный разумный способ ограничить объем памяти, который может использовать ваш процесс.

+0

Вы сделали это на C# раньше? – Nick

+0

Нет, но это не специфично для .NET. Используйте PInvoke для вызова необходимых API Win32. Подписи, вероятно, уже доступны в Интернете. – usr