代码之家  ›  专栏  ›  技术社区  ›  Gico

VB中的内存泄漏

  •  0
  • Gico  · 技术社区  · 15 年前

    我们注意到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 回复  |  直到 15 年前
        1
  •  3
  •   Hans Passant    15 年前

    你的代码没有编译,TestClass没有实现Dispose()方法。

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

    您不能发布项目的调试版本,当这些泄漏的WeakReference对象消耗所有内存时,它将爆炸。只会发布发布版本。

        2
  •  0
  •   Gico    15 年前

    好的,我在这个帖子上找到了答案。那家伙也有同样的问题。

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

    推荐文章