VB中的内存泄漏

时间:2010-11-18 07:04:08

标签: vb.net memory-leaks finalization

我们注意到一个有关VB内存管理的问题,我们不明白。如果有人可以帮我们这个,请做。

我们有一个单一事件的简单类。我们创建并销毁此类的5000个实例,在运行测试之前,我们读取进程内存使用情况。最后我们强制GC并再次检查内存。我们注意到的是,我们的内存不断增长。我们在C#中做了相同的示例,我们没有遇到这个问题。现在这里是有线点。如果我们从类中省略事件声明,内存将按照我们的预期进行清​​理。有没有人知道为什么,以及什么是最终确定这个类的正确方法。

以下是示例代码:

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim memorySize As Long
        memorySize = System.Diagnostics.Process.GetCurrentProcess().WorkingSet64

        Console.Out.WriteLine(System.Diagnostics.Process.GetCurrentProcess().WorkingSet64 / (1024.0 * 1024.0))
        For index As Integer = 1 To 5000
            Dim x As New TestClass()


            x = Nothing
            Me.Text = index.ToString()
        Next
        GC.Collect()
        Console.Out.WriteLine(System.Diagnostics.Process.GetCurrentProcess().WorkingSet64 / (1024.0 * 1024.0))
        Console.Out.WriteLine("delta: " + ((System.Diagnostics.Process.GetCurrentProcess().WorkingSet64 - memorySize) / (1024.0)).ToString() + " kb")

    End Sub
End Class

和测试类:

Imports System.ComponentModel
Imports System.ComponentModel.Design.Serialization
Imports System.Xml
Imports System.Xml.XPath

Public Class TestClass

    Friend Event ForeColorChanged()

    Public Sub New()
    End Sub


    Protected Overrides Sub Finalize()
        MyBase.Finalize()
    End Sub

End Class

几次运行后的打印输出:

22,76953125
23,828125
delta: 2016 kb
24,08984375
24,0625
delta: 228 kb
24,4375
24,2109375
delta: 24 kb
24,58984375
24,83984375
delta: 384 kb
24,84375
24,890625
delta: 48 kb

2 个答案:

答案 0 :(得分:3)

您的代码无法编译,TestClass不实现Dispose()方法。

我猜你看到了什么。 VB.NET编译器生成的Edit + Continue支持代码中存在一个已知错误。它使用WeakReference来跟踪指定的事件处理程序,在没有调试程序的情况下运行代码时,WR对象会泄露。通过注释事件或运行代码的发布版本来检查您是否可以解决问题。

你不能发布项目的Debug版本,当那些泄漏的WeakReference对象占用所有内存时,它会用OOM轰炸。只发布Release版本。

答案 1 :(得分:0)

好的,我在这篇文章中找到了答案。那家伙也有同样的问题。

http://bytes.com/topic/visual-basic-net/answers/619203-memory-leak