C#:耗尽几乎所有内存

时间:2009-12-16 01:40:57

标签: c# memory

我的目标是达到一个我已经填满所有可用内存的点(请注意,我想逐步执行此操作,因此在我上次分配之前,我剩余的内存最少)。我怎么能这样做?

8 个答案:

答案 0 :(得分:9)

for (object[] o = null;; o = new[] { o });

答案 1 :(得分:4)

一种选择是创建某种类型的列表,并在无限循环中继续添加垃圾。

根据所需的精度,可能需要一段时间 - 加速它的一个选项是最初将大型结构添加到列表元素,然后捕获OutOfMemoryError并再次尝试使用较小的东西,直到获得你需要的精确度。

答案 2 :(得分:2)

var junk = new LinkedList<byte[]>();
int allocSize = 100 * 1024 * 1024; // 100 MiB
while (allocSize > 0)
{
    try
    {
        junk.AddLast(null);
        junk.Last.Value = new byte[allocSize];
    }
    catch (OutOfMemoryException)
    {
        allocSize = (allocSize - 1) / 2;
    }
}

答案 3 :(得分:1)

您正在谈论的场景听起来可能是用于测试应用程序。

您可能需要查看负载/压力测试工具。 LoadRunner是第一个浮现在脑海中的人。它不是“在C#中”,我很确定它不是免费的,但它可能是适合这项工作的工具。此外,您可能希望查看故障注入,如果您只想查看程序如何处理OutOfMemory异常。

正是您所询问的内容,这是一篇关于消耗RAM的应用程序的文章: http://msdn.microsoft.com/en-us/magazine/cc163613.aspx

答案 4 :(得分:0)

也许是这样的?

var bytes = new List<byte[]>();
var time = new TimeSpan(100);
while (true)
{
    bytes.Add(new byte[1024]);
    Thread.Sleep(time);
}

答案 5 :(得分:0)

继续向while循环内的内存流添加大缓冲区。

答案 6 :(得分:0)

LINQ方式:

Enumerable.Range(0, int.MaxValue).ToArray();

答案 7 :(得分:0)

        int size = 1024;
        var bytes = new List<byte[]>();
        while (true)
        {
            try
            {
                bytes.Add(new byte[size]);
            }
            catch
            {                   
                if (size == 1)
                {
                    throw;
                }
                size = size / 2;
            }
        }