Я должен осуществить рефакторинг свой проект для создания его неуязвимым для OutOfMemory
исключение.
Существуют огромные наборы, используемые в моем проекте и путем изменения одного параметра, я могу сделать свою программу, чтобы быть более точным или использовать меньше памяти...
Хорошо, это - фон. То, что я хотел бы сделать, должно выполнить стандартные программы в цикле:
OutOfMemory
исключение, измените параметр и попытку выполнить его снова.Теперь, я хотел бы протестировать его. Я знаю, который я могу бросить OutOfMemory
исключение самостоятельно, но я хотел бы моделировать некоторую реальную ситуацию.
Таким образом, основной вопрос:
Есть ли способ установить некоторый предел памяти для моей программы после достижения который OutOfMemory
исключение будет выдано автоматически?
Например, я хотел бы установить предел, скажем, 400 МБ памяти для моей целой программы для моделирования ситуации, когда существует такой объем памяти, доступный в системе.
Это может быть сделано?
Я хотел бы предложить другой взгляд на это. Вам не обязательно не хватать памяти. Вам просто нужно отслеживать объем используемой памяти и сравнивать его с общей системной памятью. Возможно, здесь будет полезно что-то вроде GC.GetTotalMemory , чтобы узнать, сколько памяти использует ваше приложение. Тогда , возможно, эта статья поможет определить общий объем физической оперативной памяти, доступной в вашей системе.
Просто выделите очень большой массив. Скорее всего, вы начнете получать исключения, связанные с нехваткой памяти, когда ваше приложение C# достигнет 1,2-1,6 ГБ оперативной памяти (обычно на нижней стороне этого диапазона, при условии, что оно ориентировано на x86).
public void EatMemory()
{
List<byte[]> wastedMemory = new List<byte[]>();
while(true)
{
byte[] buffer = new byte[4096]; // Allocate 4kb
wastedMemory.Add(buffer);
}
}
. Это не займет много времени, если у вас нет 12 ГБ оперативной памяти :)
Хороший способ имитировать исключение из памяти - запустить программу в виртуальной машине (VM). Вы можете установить максимальное распределение памяти для виртуальной машины на уровень, который достаточно мал, чтобы создать давление памяти на вашу программу и спровоцировать исключение.
Несколько виртуальных машин с открытым исходным кодом: QEMU, xen и kvm. Хорошей коммерческой виртуальной машиной является VMware Fusion для Mac OS X или VMware Player для Linux/Windows.
Похоже, это задание для ... System.Runtime.MemoryFailPoint .
http://msdn.microsoft.com/en-us/library/system.runtime.memoryfailpoint.aspx
Я думаю, что пример в ссылке соответствует вашей ситуации. Установите MemoryFailPoint на любой необходимый вам уровень, а затем перехватите InsfficientMemoryException и соответствующим образом отрегулируйте входные параметры.