2013-10-29 13 views
0

沒有公佈我已經開發了具有一個鍵 當應用程序打開一個窗口的樣本WPF應用程序,如果從任務管理器觀察到的,佔用內存:12.3 MB內存WPF

Dim b As Boolean = False 
Private lst As List(Of String) 
Private Sub Btn_Close(sender As Object, e As RoutedEventArgs) 
    If b = False Then 
     If lst Is Nothing Then lst = New List(Of String) 
     For i As Integer = 0 To 30 
      lst.Add(Convert.ToBase64String(IO.File.ReadAllBytes("d:\test.txt"))) 'memory increases, test.txt file is a 2MB file 
     Next 
     'do some operations with lst object 
     'memory occupied: 133MB 
     'now again click the same button, it will go to else case now (cause of the last statement) 
    Else 
     lst.Clear() 
     If MsgBox("GC.Collect()?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then 
      GC.Collect() 
      'in this case, memory occupied: 13MB 
     Else 
      'in this case, memory occupied: 133MB, not cleared 
     End If 
    End If 
    b = Not b 
End Sub 

只有當GC.Collect的()語句被執行時內存被釋放,否則內存只保留在133MB。

我點擊任何按鈕時有一個要求,一個新的窗口打開爲showdialog,其中包含一個網格與成千上萬的記錄,說:6000到1拉赫,這裏我做一些操作與選定的記錄),然後關閉窗口。關閉窗口後,內存不會被釋放,我明確地必須執行語句GC.Collect()

代碼中是否有任何錯誤?或者爲什麼我需要顯式調用GC.Collect,因爲CLR會自動處理它? (在我的應用程序中,如果我重複上面的內容並且不使用GC.Collect,一段時間後我會發現內存異常)

回答

2

代碼沒有問題,而且內存消耗也沒有問題。無法保證關閉表單會立即釋放內存;的確,GC會在需要時回收內存,而這通常不是開發人員期望的

.NET中的垃圾回收會自動響應內存分配而觸發 - 也就是說,當您嘗試聲明不適合堆的當前Gen0的對象時,將發生垃圾回收。

真正的問題在這裏要問的是:爲什麼你有一個133MB的內存問題?它是否引起你的問題?除非你有特定要求收集這個內存,否則我會說不是GC.Collect(),並讓框架爲你解決。

(值得一提的是調用GC.Collect()手動經常對應用程序的長期記憶消耗效果。)

+0

我在實際應用中,將需要大約800MB,如果有更多的記錄數在網格中,並在下次獲得內存異常(它達到980MB左右)時,我使用的是32位機器,而應用程序是在x86下構建的 – Sandeep

+0

不,它不會:當你分配內存時, GC可能會自動啓動。當您的應用程序需要它時,GC將釋放內存*,而不是當您關閉表單時。如果你的內存異常(當你沒有調用GC.Collect),那麼你可能在其他地方有問題。 –

+0

@Sandeep - 我會懷疑將6000多條記錄加載到數據網格是否是一個好設計。沒有用戶會想要翻閱所有這些記錄。 –