2015-04-16 16 views
7

Zamanla çok iş parçacığı oluşturan bir uygulamam var. Bellek kullanımının çalıştığı ve sonunda hafızanın tükeneceği kadar büyüdüğünü fark ettim. Ancak aynı kod, iş arkadaşımın ortamındaki belleğe sızmıyor. İkimiz de aynı .net versiyonumuz var. Sorunumu, iş arkadaşımın dizüstü bilgisayarında sızıntı yapmayan ancak dizüstü bilgisayarımda bulunan aşağıdaki örnek kodla yeniden üretebildim. Yukarıda çalıştırdığınızda.Net Bellek Sızıntısı Çok sayıda iş parçacığı oluştururken

public static void Main(string[] args) 
{   
    Console.WriteLine("Version " + Environment.Version.ToString()); 

    if (Environment.Is64BitProcess) 
     Console.WriteLine("64"); 
    else 
     Console.WriteLine("32"); 

    while(true) 
    { 
     Thread t = new Thread(() => { Thread.Sleep(1); }); 
     t.IsBackground = true; 
     t.Start(); 
     Thread.Sleep(1);    
    } 
} 

, bu Visual Studio 2012 projesi için hedef çerçevesi içinde

Version 4.0.30319.18063 
32 

aşağıdaki .net framework 4.5 olduğunu yazdırır. Ben 32 bit tercih işaretli ise proje programlanmış konfigürasyon

Project Properties -> Build 
    Platform target: Any CPU 
    Prefer 32-bit: checked 

aşağıdaki bellek sızdırıyor, su almaması. bellek sızdırıyor

başka yapılandırma benim iş arkadaşımın dizüstü kaçak yapmaz benim laptop sızdırıyor

Project Properties -> Build 
    Platform target: x86 
    Prefer 32-bit: disabled 

çıkan çalıştırılabilir olduğunu.

Bellek sızıntılarını bulmak için CLR Profiler kullanıyorum ancak sızıntı yapan hiçbir şey göstermiyor. Fakat windows kaynak monitöründe çalışma setinin yaklaşık 1 MB/sn arttığını görüyorum.

Bellek kullanımımın ortamımda 32 bitlik modda artmasına neden oluyor, ancak iş arkadaşım değil?

+1

ben senin meslektaşı olarak (hiçbir sızıntı) aynı davranışı elde benim PC'de bu deneyin FWIW zaman. – Cameron

+0

Ve iş arkadaşınız hangi sürümleri çalıştırıyor? –

+1

[Umdh tool] 'u kullanmayı deneyin (https://msdn.microsoft.com/en-us/library/windows/hardware/ff560206%28v=vs.85%29.aspx) (32-bit'i yüklediğinizden emin olun) Tüm hafızayı kimin tahsis ettiğini görmek için Windows için Hata Ayıklama Araçları). Ayrıca, uyku yöntemini uyku modundan çıkarırsanız ne olur? – Cameron

cevap

-2

Aynı anda çalıştığınız eşzamanlı iş parçacığı sayısını sınırlandırmalısınız ve iş parçacığı havuzu kullanabilirsiniz, böylece eklediğiniz ve tanımladığınız havuz boyutunu aşan konuları sıralayabilirsiniz.

https://msdn.microsoft.com/en-us/library/h4732ks0.aspx

0

tüm yorumları okumak ve benim yorum var kaybettim, bu yüzden yanıtlamaya çalışın olacağını korkuyor ettik.

.NET uygulamaları, JetBrains dotMemory veya ANTS için tasarlanan veya WinDBG veya Task Manager veya diğer yerel bellek araçları için tasarlanmış bellek oluşturucu kullanın.

Seçtiğiniz profilin gerçek zamanlı grafiğini kullanarak uygulamanızın ve dizüstü bilgisayarınızın dizüstü bilgisayarlarında nasıl bir davranış sergilediğini karşılaştırabilirsiniz. Sanırım hafızanın kullanımının dizüstü bilgisayarınızda sürekli olarak arttığını göreceksiniz - sadece bir bellek anlık görüntüsü alıp kaç tane Thread nesnesinin bellekte olduğunu, hangi nesnelerin belleğin çoğunu aldığını ve neden ve kimlerin bellekte tutulduğunu araştırın.