0

我正在尝试做内存泄漏 Visual C#。我使用了这段代码:

class Program
{
    static void Main(string[] args)
    {
        List<float> s = new List<float>();
        while (true) {
            s.Add(10 ^ 10);
        }
    }
}

我运行了这个程序,在 2 分钟内,我得到了 OutofMemory 异常。这是内存泄漏的真实代码吗?我正在监视主内存空间,它有足够的空间。如果这是内存泄漏,那么即使 ram 中有空间,这也会导致这个内存泄漏?如何监控此泄漏?

4

3 回答 3

5

这不是内存泄漏。您添加的每个数字仍然可以从您的列表对象中访问。你的代码只是使用了大量的内存,最终你用完了。

您可能正在达到单个对象的最大内存量

垃圾收集器将确保与对象关联的内存在不再引用该对象时被释放。

于 2013-05-01T16:41:10.160 回答
2

您的示例不是内存泄漏,您将耗尽内存,但您创建的所有对象都可以被正在运行的程序访问。泄漏是指内存中有无法访问的对象。以下是 .NET 中最常见的泄漏原因示例,订阅静态事件:

internal class Program
{
    public static event EventHandler SomeStaticEvent;

    private static void Main()
    {
        while (true)
        {
            var a = new A();                

            //here a goes out of scope but won't be collected by GC because Program still holds reference to "a" by a static event subsription
        }
    }      
    public class A
    {                       
        public A()
        {
            //if you comment this line, there is no reference from Program to A and a will be GC-ed and memory allocated will be released
            Program.SomeStaticEvent+=ProgramOnSomeStaticEvent;
        }
        private void ProgramOnSomeStaticEvent(object sender, EventArgs eventArg){}
    }

}

订阅静态事件或长寿对象的事件时要小心。您的程序正在泄漏,并且不容易发现原因。始终在对象超出范围之前取消订阅此类事件。

于 2013-05-01T17:56:30.247 回答
1

你期待s.Add做什么?每次执行时,它都会在您的列表中添加一个新元素。所以第一次,你会有一个包含一个元素的列表,第二次s现在是一个包含 2 个元素的列表,第 100 万次它会有一百万个元素。它会一直这样下去,直到它太大而无法存储在内存中。

于 2013-05-01T17:01:21.467 回答