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