2010-11-18 40 views
0

VB'deki bellek yönetimiyle ilgili anlamadığımız ilginç bir sorun fark ettik. Bu konuda bize yardım edebilecek biri varsa lütfen.VB'de bellek sızıntısı

Tek bir etkinliğe sahip basit bir sınıfa sahibiz. Bu sınıfın 5000 örneğini oluşturup yok ediyoruz ve bir test yapmadan önce işlem belleği kullanımını okuyoruz. Sonunda GC'yi zorluyoruz ve hafızayı tekrar kontrol ediyoruz. Fark ettiğimiz şu ki, sürekli bir hafıza büyüyoruz. Aynı örneği C# ile yaptık ve bu konuya girmedik. Şimdi burada kablolu nokta. Sınıftan etkinlik beyanı çıkarırsak, bellek beklediğimiz gibi temizlenecektir. Herhangi biri neden olduğunu biliyor ve bu dersi bitirmek için doğru yol nedir. Birkaç koşular sonrasında

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 

Ve çıktı:

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 

ve test sınıfı: Burada

örnek kod ben bu yazı üzerine bir cevap buldu

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 

cevap

3

Kodunuz TestClass Dispose() yöntemini uygulamıyor, derleme yapmaz.

Ne gördüğünü tahmin edebilirim. VB.NET derleyicisinin oluşturduğu Edit + Continue destek kodunda bilinen bir hata var. Atanan olay işleyicileri izlemek için bir WeakReference kullanır, kodunuzu bir hata ayıklayıcı olmadan çalıştırdığınızda WR nesnesi sızdırılır. Sorununuzu ya Olayı yorumlayarak veya Kodunuzun Sürüm yapısını çalıştırarak çözüp çözemeyeceğinizi kontrol edin.

Projenizin Debug yapısını gönderemezsiniz, bu sızan WeakReference nesneleri tüm belleği tükettiğinde OOM ile bombalanır. Sadece piyasaya sürülen Sürüm'ü gönderin.

+0

Evet, bunun için üzgünüm. Bu çizgiyi kaldırdım. Ama evet haklısın. bu bir böcek. Ben relase ve kod optimizasyonu ayarlamak ve bellek yönetimi şimdi tamam. Cevabınız için teşekkürler. – Gico