我有一个长时间运行的应用程序,由于内存泄漏而一直失败。
我怀疑我使用静态属性可能是原因。以下是我今天所拥有的一个例子:
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
属性)一旦超出范围,是否会得到适当的垃圾回收?
答案 0 :(得分:4)
不,仅引用全局静态属性不会造成内存泄漏。你发布的例子很好。范围结束后,shortLived
将被清除,当您的程序退出时,Fixed1
的引用将被清除。您的问题很可能在其他地方,但从您的简单示例中无法说出来。您是否有任何证据表明您正在查看内存泄漏?
我建议您使用内存分析器或获取完整内存转储并进行分析(WinDbg是免费的,但还有其他更容易使用但付费工具)。您可以尝试使用的另一个工具是来自Microsoft的DebugDiag(也是免费的) - 获取转储然后通过DebugDiag运行它以获取内存报告。
正如@EricJ在评论中提到的,Visual Studio 2015中的分析器也是分析内存使用的一个很好的工具,它可以在所有版本中使用,包括免费Community Edition。