2008-10-22 22 views
27

C# 'daki bellek sızıntılarının nedenini izleme konusunda bazı önerilerde bulunabilir. Bellek sızıntısının ne olduğunu anlıyorum ve neden C# 'de meydana geldiğini anlıyorum ama geçmişte bunları çözmek için hangi araçları/stratejileri kullandınız?C# WPF'de Bellek Sızıntıları

.NET Bellek Profiler kullanıyorum ve pencereyi kapattıktan sonra büyük ana nesnelerimden birinin bellekte kaldığını öğrendim ancak ciddi tüm bağlantılara ne yapacağımı bilmiyorum.

Yeterli açıklamıyorsam, bir soruya cevap yazmam gerekirse ve sorumu yanıt olarak düzenlerim. Teşekkürler!

+0

aynı zamanda, Karınca Nesnesi Profilcisini, belirli bir nesneyi cadı nesnelerinin göstereceği gibi Karıncalar Öğütücüsünü de deneyin –

cevap

39

ayıklayıcıya Molası ve sonra komut penceresi içine bu yazın:

.load C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos.dll 

yol Sos.dll değişmektedir. Doğru yolu bulmanın yolu Modules bölmesinde mscorwks.dll dosyasını aramaktır. Nereden yüklendiği, sos.dll için doğru yoldur.

O zaman bu yazın: ulaşılamıyor şey sağlayacaktır

System.GC.Collect() 

toplanır. Sonra şunu yazın:

!DumpHeap -type <some-type-name> 

Bu, tüm mevcut örneklerin adreslerini ve adreslerini gösterir. Böyle bir örnek canlı tutuyor öğrenebilirsiniz:

!gcroot <some-address> 
+0

Çalıştırmak için çöp toplama almak için System.GC.Collect() kullanmam gerekiyordu. – nash

+0

Sanırım bu, hata ayıklayıcının içine girdiğinizde durduğu yere bağlı olabilir. Cevabımı düzeltirim, böylece işe yaramaz. –

8

NET bellek Profiler mükemmel bir araçtır ve WPF uygulamalarında bellek sızıntılarını teşhis etmek sık kullandığınız biridir.

Farkettiğinizden emin olarak, bunu kullanmanın iyi bir yolu, belirli bir özelliği kullanmadan önce bir anlık fotoğraf çekmek, sonra kullandıktan sonra ikinci bir anlık fotoğraf çekmek, pencereyi kapatmak, vb. anlık görüntüler, belirli bir türden kaç nesnenin ayrıldığını ancak serbest bırakılmadığını görebilirsiniz: bu bir sızıntıdır.

Bir türe çift tıkladıktan sonra profiler size bu tür nesneleri canlı tutmanın en kısa kök yollarını gösterecektir. .NET nesnelerinin WPF'de sızabilmesi için birçok farklı yol vardır, bu nedenle gördüğünüz kök yolunu yayınlamak, nihai nedenleri tanımlamaya yardımcı olmalıdır. Bununla birlikte, genel olarak, bu nesnelerin neden nesnenize tuttuğunu anlamaya çalışın ve pencere kapatıldığında etkinlik işleyicilerinizi, bağlaçlarınızı vb.

Son zamanlarda, belirli bağlamalar nedeniyle oluşabilecek bir memory leak hakkında bir blog entry gönderdim; Bu özel sızıntı türleri için, kod, Bağlantılı olanı bulmakta yararlıdır.

İlgili konular