2016-05-31 62 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

當然,保持答案儘可能完整和有用始終是個好主意。 –