沒有公佈我已經開發了具有一個鍵 當應用程序打開一個窗口的樣本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,一段時間後我會發現內存異常)
我在實際應用中,將需要大約800MB,如果有更多的記錄數在網格中,並在下次獲得內存異常(它達到980MB左右)時,我使用的是32位機器,而應用程序是在x86下構建的 – Sandeep
不,它不會:當你分配內存時, GC可能會自動啓動。當您的應用程序需要它時,GC將釋放內存*,而不是當您關閉表單時。如果你的內存異常(當你沒有調用GC.Collect),那麼你可能在其他地方有問題。 –
@Sandeep - 我會懷疑將6000多條記錄加載到數據網格是否是一個好設計。沒有用戶會想要翻閱所有這些記錄。 –