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