2011-11-30 36 views
3

我創建了一個簡單的WPF C#有一個文本框和DispatcherTimer顯示到GC.GetTotalMemory(真)每秒呼叫的結果。每次調用返回的值穩步增加,任務管理器顯示私人工作記憶集也增加。 這真的是內存泄漏,還是隻是一個外觀?在我的真正的應用程序,每個滴答作出更多的內存泄漏出現顯着更高。 我的代碼如下爲什麼我的簡單的WPF C#與DispatcherTimer應用程序出現內存泄漏?

XAML

<Window x:Class="TestWPFApplication.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <TextBox Name="memoryuseage"></TextBox> 
    </Grid> 
</Window> 

xaml.cs

namespace TestWPFApplication 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     System.Windows.Threading.DispatcherTimer tmr; 

     public Window1() 
     { 
      InitializeComponent(); 

      tmr = new System.Windows.Threading.DispatcherTimer(); 
      tmr.Interval = new System.TimeSpan(0, 0, 1); 
      tmr.Tick += new EventHandler(StaticTick); 
      tmr.Start(); 
     } 

     void StaticTick(object o, EventArgs sender) 
     { 
      memoryuseage.Text = GC.GetTotalMemory(true).ToString(); 
     } 
    } 
} 

回答

1

這是一個真正的內存泄漏,或者一個剛剛出現?

只是外觀。一個穩定的增長是正常的,它不是一個泄漏,直到你可以通過運行足夠長的時間來崩潰它。但是這可能需要幾天時間才能發生小泄漏。

你的內存使用情況應該穩定下來,但只有一個相當長的時間之後。您可以通過在這裏使用GC.Collect()來加快速度(每隔10秒左右)。

對於嚴重的診斷,您將需要一個內存分析器。

例如:http://en.wikipedia.org/wiki/CLR_Profiler

+0

CLR_Profiler告訴我,我有1.7M分配和任務管理器告訴我,我有127M。你知道CLR_​​Profiler是否有能力將分配數據轉儲到文件中? –

1

我不認爲會出現在你的代碼中的內存泄漏。內存增加只是因爲GC.Collect()方法不是實時調用的。 試試這個:

 void StaticTick(object o, EventArgs sender) 
     { 
      GC.Collect(); 
      memoryuseage.Text = GC.GetTotalMemory(true).ToString(); 
     } 
+0

調用GC.Collect()幾乎總是一個糟糕的主意,而且它經常不會真正做到你認爲的那樣。例如:參考文獻可能存在你沒有意識到的意思,這意味着你最終會將目標提升到更高的世代,導致它們更長時間地停留在記憶中。 –

相關問題