【问题标题】:Memory leak in VBVB中的内存泄漏
【发布时间】:2010-11-18 07:04:08
【问题描述】:

我们注意到一个关于 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

【问题讨论】:

    标签: vb.net memory-leaks finalization


    【解决方案1】:

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

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

    您无法发布项目的 Debug 版本,当那些泄漏的 WeakReference 对象消耗所有内存时,它将与 OOM 一起爆炸。只发布发布版本。

    【讨论】:

    • 是的,很抱歉。我删除了这条线。但是,是的,你是对的。这是一个错误。我设置了发布和代码优化,内存管理现在还可以。谢谢你的回答。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 2015-12-01
      • 2010-12-20
      • 2020-05-26
      相关资源
      最近更新 更多