内存未释放WPF

内存未释放WPF,wpf,vb.net,memory-leaks,Wpf,Vb.net,Memory Leaks,我开发了一个示例WPF应用程序,它有一个窗口和一个按钮 当应用程序打开时,如果从任务管理器观察,则占用内存:12.3 MB 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

我开发了一个示例WPF应用程序,它有一个窗口和一个按钮 当应用程序打开时,如果从任务管理器观察,则占用内存:12.3 MB

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到1Lakh,在这里我对所选记录执行一些操作(这里内存增加),然后关闭窗口。关闭窗口后,内存没有释放,我必须显式执行语句GC.Collect()


代码中有什么错误吗?或者为什么我需要显式调用GC.Collect,因为CLR会自动处理它?(在我的应用程序中,如果我重复上面的步骤,并且不使用GC.Collect,我会在一段时间后退出内存异常)

代码没有问题,内存消耗也没有问题。无法保证关闭表单会立即释放内存;实际上,GC将在需要时回收内存,而开发人员通常不希望这样做

NET中的垃圾收集会自动触发,以响应内存分配—也就是说,当您试图声明不适合堆当前Gen0的对象时,将发生垃圾收集

这里要问的真正问题是:为什么内存保持在133MB会有问题?这会给你带来麻烦吗?除非您对要收集的内存有特定要求,否则我建议不要
GC.Collect()
,让框架为您解决这个问题


(值得注意的是,手动调用
GC.Collect()
通常会对应用程序的长期内存消耗产生负面影响。)

在我的实际应用程序中,如果网格中有更多的记录,则需要大约800MB,并在下一次退出内存异常(达到980MB左右),我使用的是32位机器,应用程序是在x86No下构建的。它不会:当您分配内存时,GC可能会自动启动。GC将在应用程序需要时释放内存,而不是在关闭窗体时释放。如果出现内存不足异常(当您不调用
GC.Collect
)时,您可能在其他地方遇到问题。@Sandeep-我怀疑将6000多条记录加载到数据网格是否是一个好的设计。没有用户希望翻阅所有这些记录。