如何模拟OutOfMemory异常

时间:2010-05-06 15:32:39

标签: c# memory-management simulation out-of-memory

我需要重构我的项目,以使其免受OutOfMemory异常的影响。

我的项目中使用了大量的集合,通过更改一个参数,我可以使我的程序更准确或使用更少的内存......

好的,那就是背景。我想做的是循环运行例程:

  1. 使用默认参数运行子例程。
  2. 抓住OutOfMemory例外,更改参数并尝试再次运行。
  3. 执行第二点,直到参数允许运行子例程而不抛出异常(通常,只需要进行一次更改)。
  4. 现在,我想测试一下。我知道,我可以自己抛出OutOfMemory例外,但我想模拟一些真实的情况。

    所以主要问题是:
    有没有办法为我的程序设置某种内存限制,在达到OutOfMemory异常将被自动抛出后?
    例如,我想设置一个限制,假设我的整个程序有400MB的内存来模拟系统中有这么多可用内存的情况。
    可以吗?

6 个答案:

答案 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)

模拟内存不足异常的一种好方法是在虚拟机(VM)中运行该程序。您可以将虚拟机的最大内存分配设置为足够小的级别,以便为程序创建内存压力并引发异常。

一些开源虚拟机包括:QEMUxenkvm。 一个好的商业虚拟机是适用于Mac OS X的VMware Fusion或适用于Linux / Windows的VMware Player。