2016-05-31 64 views
1

我有一个长时间运行的应用程序,由于内存泄漏一致失败。是否引用静态属性导致内存泄漏

我怀疑我使用静态属性可能是原因。下面是我今天的例子:

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.Object1属性)的ShortLived其参考StaticReferences.Fixed1实例得到妥善收集垃圾一旦超出范围?

+4

是什么让你觉得有内存泄漏? –

+0

这是一个控制台应用程序,它运行需要几个小时完成的过程。它会因内存不足异常而失败。我通过Jetbrains DotMemory运行它。非托管内存空间不断增长。托管memorý是稳定的.. –

+3

@JakobGade你的程序做什么需要非托管内存?该部分是由您还是通过第三方组件实施的?非托管内存如何处理? – xxbbcc

回答

4

不,只是引用全局静态属性不会产生内存泄漏。你发布的例子很好。 shortLived将在其作用域结束后被清除,当程序退出时,将清除对Fixed1的引用。你的问题很可能在其他地方,但从你简单的例子来说是不可能的。你有没有证明你正在查看内存泄漏?

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

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

+1

VS2015中的内存分析器效果很好,即使在社区版中也可用https://blogs.msdn.microsoft.com/visualstudioalm/2015/07/20/performance-and-diagnostic-tools-in-visual-studio -2015/ –

+0

@EricJ。谢谢,如果你不介意的话,我会更新我的答案以包括这一点。 – xxbbcc

+0

当然,保持答案尽可能完整和有用始终是个好主意。 –