2010-11-18 3 views
0

Nous avons remarqué un problème intéressant concernant la gestion de la mémoire dans VB que nous ne comprenons pas. Si quelqu'un peut nous aider avec celui-ci, s'il vous plaît faire.Fuite de mémoire dans VB

Nous avons une classe simple avec un seul événement. Nous créons et détruisons 5000 instances de cette classe et avant d'exécuter un test, nous lisons l'utilisation de la mémoire de processus. À la fin, nous forçons GC et vérifions à nouveau la mémoire. Ce que nous avons remarqué, c'est que nous avons une mémoire constante qui grandit. Nous avons fait le même exemple en C# et nous n'avons pas rencontré ce problème. Maintenant, voici le point filaire. Si nous omettons la déclaration d'événement de la classe, la mémoire sera nettoyée comme prévu. Est-ce que quelqu'un sait pourquoi, et quelle est la bonne façon de finaliser cette classe.

Voici l'exemple de code:

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 

et classe de test:

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 

Et l'impression après plusieurs séries:

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 

Répondre

3

Votre code ne compile pas, TestClass ne met pas en œuvre la méthode Dispose().

Je peux deviner ce que vous voyez. Il existe un bogue connu dans le code de support Edit + Continue généré par le compilateur VB.NET. Il utilise un WeakReference pour suivre les gestionnaires d'événements affectés, que l'objet WR est divulgué lorsque vous exécutez votre code sans débogueur. Vérifiez si vous pouvez résoudre votre problème en commentant l'événement ou en exécutant la version Release de votre code.

Vous ne pouvez pas expédier la version Debug de votre projet, elle va bombarder avec OOM lorsque ces objets WeakReference perdus consomment toute la mémoire. Envoyez uniquement la version Release.

+0

Oui désolé à ce sujet. J'ai enlevé cette ligne. Mais oui, vous avez raison. c'est un bug. J'ai mis à l'optimisation et à l'optimisation du code et la gestion de la mémoire est correcte maintenant. Merci pour votre réponse. – Gico