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