我创建了这个简单的C#程序,期望它抛出OutOfMemoryException。 问题是它没有使用我所有的笔记本电脑内存完美地工作为什么?如何让它泄漏所有内存?
static void Main(string[] args)
{
for (int i = 0; true; i++)
{
new MustDispose();
}
}
class MustDispose
{
public MustDispose()
{
StreamReader r = null;
r = File.OpenText("C:\\Users\\rverdelli\\Desktop\\asd.txt");
if (r.EndOfStream) return;
Console.WriteLine(r.ReadToEnd());
}
}
答案 0 :(得分:3)
循环的每次迭代都不会存储超出该迭代范围的任何状态,因此当它超过该迭代中分配的所有内存时,可以释放它。
如果你想耗尽内存,你需要抓住你正在分配的内存。
这是一个足够简单的示例,在运行内存时应该没有问题:
var data = Enumerable.Range(0, int.MaxValue)
.Select(i => new int[int.MaxValue])
.ToArray();
Console.WriteLine(data.Length);
答案 1 :(得分:3)
在您的方法MustDispose()
中,有一个重要的字符:
}
这定义了范围的结束,这意味着局部变量不再有效。不再有效告诉垃圾收集器删除局部变量,特别是r
以及所有甚至没有分配给变量的临时结果(即r.EndOfStream
的布尔返回值和字符串r.ReadToEnd()
)。
吃掉所有记忆的可能性各不相同,例如
var keeper = new List<byte[]>();
while(true)
{
keeper.Add(new byte[1024*1024]);
}
如果IDisposable interface is implemented correctly,Finalizer将检查是否已调用Dispose()。如果没有,Finalizer将会这样做。