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

Как имитировать исключение OutOfMemory

Мне нужно реорганизовать мой проект, чтобы он был защищен от исключения OutOfMemory.

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

Хорошо, что фон. То, что я хотел бы сделать, - запустить подпрограммы в цикле:

  • Запустите подпрограммы с параметром по умолчанию.
  • Поймайте исключение OutOfMemory, измените параметр и попробуйте запустить его снова.
  • Сделайте вторую точку до тех пор, пока параметры не позволят запускать подпрограммы, не вызывая исключение (обычно требуется только одно изменение).

Теперь я хотел бы проверить это. Я знаю, что я могу выбросить исключение OutOfMemory самостоятельно, но я хотел бы имитировать реальную ситуацию.

Итак, главный вопрос:
Есть ли способ установить какой-то предел памяти для моей программы, после чего будет автоматически выбрано исключение OutOfMemory?
Например, я хотел бы установить ограничение, скажем, 400 Мбайт памяти для всей моей программы, чтобы имитировать ситуацию, когда в системе имеется такой объем памяти.
Это можно сделать?

4b9b3361

Ответ 1

Я хотел бы предложить другой способ взглянуть на это. У вас не обязательно заканчиваться память. Вам просто нужно контролировать объем используемой памяти и сравнивать ее с общей системной памятью. Возможно, что-то вроде GC.GetTotalMemory будет полезно здесь, чтобы узнать, сколько памяти используется вашим приложением. Тогда возможно, эта статья поможет получить общее количество физической памяти в вашей системе.

Ответ 2

Это выглядит как работа для... System.Runtime.MemoryFailPoint.

http://msdn.microsoft.com/en-us/library/system.runtime.memoryfailpoint.aspx

Я думаю, что пример в ссылке соответствует вашей ситуации. Установите MemoryFailPoint на любой уровень, который вам нужен, а затем поймайте InsufficientMemoryException и соответствующим образом настройте параметры ввода.

Ответ 3

Просто выделите очень большой массив. Скорее всего, вы начнете получать исключения из памяти, как только ваше приложение С# достигнет 1,2-1,6 ГБ использования ОЗУ (обычно на нижней стороне этого диапазона, при условии его назначения x86).

Ответ 4

public void EatMemory()
{
    List<byte[]> wastedMemory = new List<byte[]>();

    while(true)
    {
        byte[] buffer = new byte[4096]; // Allocate 4kb
        wastedMemory.Add(buffer);
    }
}

Не нужно долго ждать, если у вас нет 12 гб оперативной памяти:)

Ответ 5

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

Несколько VM с открытым исходным кодом: QEMU, xen и kvm. Хорошей коммерческой виртуальной машиной является VMware Fusion для Mac OS X или VMware Player для Linux/Windows.

Ответ 6

string value = new string('crazy', int.MaxValue);