2010-05-06 126 views
18

我需要重构我的项目以使其免于OutOfMemory异常。如何模拟OutOfMemory异常

有在我的项目,并通过改变一个参数,我可以让我的计划,以更准确或使用较少的内存使用巨大的收藏品...

OK,这是背景。我想要做的是在循环中运行例程:

  1. 使用默认参数运行子例程。
  2. 捕获OutOfMemory异常,更改参数并尝试再次运行它。
  3. 做第二点,直到参数允许运行子例程而不引发异常(通常,只需要一个更改)。

现在,我想测试它。我知道,我可以自己抛出OutOfMemory例外,但我想模拟一些真实情况。

所以今天的主要问题是:
有没有设定某种形式的内存限制我的程序的方式,达到其OutOfMemory异常将被自动抛出后?
例如,我想设置一个限制,假设我的整个程序有400MB的内存来模拟系统中存在如此大量内存的情况。
可以这样做吗?

回答

2

我想建议的看着这个法子。你不一定要耗尽内存。您只需要监视所使用的内存量,并将其与总系统内存进行比较。也许像GC.GetTotalMemory这样的东西可以用来查看你的应用程序使用了多少内存。然后perhaps this article将有助于获取系统上可用的物理RAM总量。

+0

嗯,我甚至不需要将它与系统内存进行比较,我只需要知道我的程序使用了多少MB的RAM。我需要阅读GC的文档...谢谢! – Gacek 2010-05-06 15:47:01

+0

好的...既然你在寻找OutOfMemoryException,我想你为了达到最佳性能的目的而在某个时间点用完了。但是,嘿,如果GC方法适合你,很酷! – Dave 2010-05-06 15:51:26

+0

嗯,我想我可以使用GC方法并在达到一定限度后自行抛出异常。也许一些背景工作者......我需要测试它是否会起作用。 – Gacek 2010-05-06 15:55:04

5

只分配一个非常大的数组。一旦C#应用程序的内存使用量达到1.2-1.6GB(通常在该范围的较低端,提供目标x86),您很可能会开始发生内存异常。除非你有RAM :)的12GB

+0

好的,但我可以通过抛出OutOfMemory异常来获得相同的结果。我想模拟真实情况并使用一些小数据集(消耗大约400MB RAM而不是1.6GB)来测试它 – Gacek 2010-05-06 15:40:30

+0

这在64位上无法可靠运行。 – Thorsten79 2010-05-06 15:42:19

+0

更好的是,开始构建数组,每个数组长度为1GB。你将能够很快地重现它。 – Nayan 2010-05-06 16:22:32

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

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

不宜长时间

+3

Om nom nom! Windows将应用程序限制为x86上的2GB内存,我认为它在64位上略高一些,所以12GB无关紧要。 – NibblyPig 2010-05-06 15:39:08

+0

有意思的是,我运行了上面的代码,并且很好地编写了我的PC。 Windows完全没有响应,最终我到任务管理器使用3GB内存来查看Visual STudio。我没有得到任何例外,内存使用量持续上升至约3.1GB,然后跳回到3GB ......我有4GB RAM。 – NibblyPig 2010-05-06 15:46:52

+0

@SLC:页面文件可能保护你免受这种情况的侵害,当你注意到你的电脑慢慢爬行时,它可能会被启动。 – Dave 2010-05-06 15:52:19

16

这看起来像一个工作... System.Runtime.MemoryFailPoint

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

我想在链接的例子符合你的情况。将MemoryFailPoint设置为您需要的任何级别,然后捕获InsufficientMemoryException并相应地调整输入参数。

+0

看来,这个类与我所需要的完全相反。它实际上检查是否有一定量的内存可用(例如,调用MemoryFailPoint(100)'可以检查是否可以执行100MB的操作。我需要的是检查我的程序已消耗了多少内存。 – Gacek 2010-05-06 18:18:53

2

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

一些开源虚拟机是:QEMU,xenkvm。 好的商用虚拟机是VMware Fusion for Mac OS X或VMware Player for Linux/Windows。

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