对静态属性的引用是否会导致内存泄漏

时间:2016-05-31 17:18:44

标签: c#

我有一个长时间运行的应用程序,由于内存泄漏而一直失败。

我怀疑我使用静态属性可能是原因。以下是我今天所拥有的一个例子:

public class StaticReferences
{
    public static readonly object Fixed1 = new object();
}

public class ShortLived
{
    public object Object1;
}

public class Doer // This class is instantiated once
{
    public void DoStuff() // This method is called over and over again.
    {
        var shortLived = new ShortLived() 
        {
            Object1 = StaticReferences.Fixed1
        };
    }
}

ShortLived的实例及其对StaticReferences.Fixed1的引用(通过ShortLived.Object1属性)一旦超出范围,是否会得到适当的垃圾回收?

1 个答案:

答案 0 :(得分:4)

不,仅引用全局静态属性不会造成内存泄漏。你发布的例子很好。范围结束后,shortLived将被清除,当您的程序退出时,Fixed1的引用将被清除。您的问题很可能在其他地方,但从您的简单示例中无法说出来。您是否有任何证据表明您正在查看内存泄漏?

我建议您使用内存分析器或获取完整内存转储并进行分析(WinDbg是免费的,但还有其他更容易使用但付费工具)。您可以尝试使用的另一个工具是来自Microsoft的DebugDiag(也是免费的) - 获取转储然后通过DebugDiag运行它以获取内存报告。

正如@EricJ在评论中提到的,Visual Studio 2015中的分析器也是分析内存使用的一个很好的工具,它可以在所有版本中使用,包括免费Community Edition