Wir haben ein interessantes Problem in Bezug auf Speicherverwaltung in VB bemerkt, das wir nicht verstehen. Wenn uns jemand helfen könnte, bitte.Speicherleck in VB
Wir haben eine einfache Klasse mit einem einzigen Ereignis. Wir erstellen und zerstören 5000 Instanzen dieser Klasse und bevor wir einen Test ausführen, lesen wir die Prozessspeicherauslastung. Am Ende zwingen wir GC und überprüfen die Erinnerung erneut. Was wir gemerkt haben, ist, dass wir ein konstantes Gedächtnis haben. Wir haben das gleiche Beispiel in C# gemacht und sind auf dieses Problem nicht eingegangen. Jetzt ist hier der verdrahtete Punkt. Wenn wir die Ereignisdeklaration von der Klasse weglassen, wird der Speicher wie erwartet gelöscht. Weiß jemand warum und was ist der richtige Weg, um diese Klasse abzuschließen? Hier
ist der Beispielcode:
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
und Testklasse:
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
Und der Ausdruck nach mehreren Durchläufen:
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
Ja, tut mir leid. Ich habe diese Zeile entfernt. Aber ja, du hast Recht. Es ist ein Fehler. Ich setze auf Relay und Code-Optimierung und die Speicherverwaltung ist jetzt in Ordnung. Danke für deine Antwort. – Gico