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

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

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

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

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

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

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

19
задан Gacek 6 May 2010 в 15:32
поделиться

5 ответов

​​

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

2
ответ дан 30 November 2019 в 03:33
поделиться

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

5
ответ дан 30 November 2019 в 03:33
поделиться
public void EatMemory()
{
    List<byte[]> wastedMemory = new List<byte[]>();

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

. Это не займет много времени, если у вас нет 12 ГБ оперативной памяти :)

8
ответ дан 30 November 2019 в 03:33
поделиться

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

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

2
ответ дан 30 November 2019 в 03:33
поделиться

Похоже, это задание для ... System.Runtime.MemoryFailPoint .

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

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

17
ответ дан 30 November 2019 в 03:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: