我需要重构我的项目,以使其免受OutOfMemory
异常的影响。
我的项目中使用了大量的集合,通过更改一个参数,我可以使我的程序更准确或使用更少的内存......
好的,那就是背景。我想做的是循环运行例程:
OutOfMemory
例外,更改参数并尝试再次运行。现在,我想测试一下。我知道,我可以自己抛出OutOfMemory
例外,但我想模拟一些真实的情况。
所以主要问题是:
有没有办法为我的程序设置某种内存限制,在达到OutOfMemory
异常将被自动抛出后?
例如,我想设置一个限制,假设我的整个程序有400MB的内存来模拟系统中有这么多可用内存的情况。
可以吗?
答案 0 :(得分:17)
这看起来像... System.Runtime.MemoryFailPoint 。
http://msdn.microsoft.com/en-us/library/system.runtime.memoryfailpoint.aspx
我认为链接中的示例符合您的情况。将 MemoryFailPoint 设置为您需要的任何级别,然后捕获 InsufficientMemoryException 并相应地调整输入参数。
答案 1 :(得分:8)
public void EatMemory()
{
List<byte[]> wastedMemory = new List<byte[]>();
while(true)
{
byte[] buffer = new byte[4096]; // Allocate 4kb
wastedMemory.Add(buffer);
}
}
除非你有12gb的ram,否则不应该花很长时间。)
答案 2 :(得分:5)
只需分配一个非常大的数组。一旦您的C#应用程序达到1.2-1.6GB的RAM使用率(通常在该范围的较低端,假设其目标为x86),您很可能会开始出现内存异常。
答案 3 :(得分:3)
string value = new string('crazy', int.MaxValue);
答案 4 :(得分:2)
我想建议另一种方式来看待这个问题。你不一定要耗尽内存。您只需要监视使用的内存量,并将其与系统总内存进行比较。也许像GC.GetTotalMemory这样的东西在这里看看你的应用程序使用了多少内存。然后perhaps this article将有助于获取系统上可用的物理RAM总量。
答案 5 :(得分:2)