如何模拟OutOfMemory异常

Gac*_*cek 19 c# simulation memory-management out-of-memory

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

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

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

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

现在,我想测试一下.我知道,我可以OutOfMemory自己抛出异常,但我想模拟一些真实的情况.

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

Alf*_*dBr 17

这看起来像... System.Runtime.MemoryFailPoint的工作.

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

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


Are*_*ren 8

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

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

除非你有12gb的RAM,否则不应该花很长时间:)

  • Om nom nom!Windows将应用程序限制为x86上的2GB内存,我认为它在64位上略高,所以12GB无关紧要. (4认同)

Ree*_*sey 5

只需分配一个非常大的数组.一旦您的C#应用​​程序达到1.2-1.6GB的RAM使用率(通常在该范围的较低端,假设其目标为x86),您很可能会开始出现内存异常.


Dav*_*ave 2

我想建议另一种看待这个问题的方式。您不一定要耗尽内存。您只需要监视所使用的内存量,并将其与系统总内存进行比较。也许像GC.GetTotalMemory这样的东西在这里会很有用,可以查看您的应用程序使用了多少内存。那么也许本文将有助于获取系统上可用的物理 RAM 总量。