2010-11-18 20 views
0

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 

Antwort

3

Ihr Code kompiliert nicht weiß, macht nicht die Testclass Dispose() -Methode implementieren.

Ich kann aber erraten, was Sie sehen. Es gibt einen bekannten Fehler im Edit + Continue-Unterstützungscode, den der VB.NET-Compiler generiert. Es verwendet eine WeakReference, um zugewiesene Ereignishandler zu verfolgen, dass das WR-Objekt durchgelaufen ist, wenn Sie Ihren Code ohne einen Debugger ausführen. Überprüfen Sie, ob Sie Ihr Problem beheben können, indem Sie entweder das Ereignis auskommentieren oder das Release-Build Ihres Codes ausführen.

Sie können das Debug-Build Ihres Projekts nicht senden, es wird mit OOM bombardieren, wenn die ausgelaufenen WeakReference-Objekte den gesamten Speicher belegen. Versende nur den Release-Build.

+0

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