2015-04-16 8 views
7

मेरे पास एक ऐसा एप्लिकेशन है जो समय के साथ बहुत सारे धागे बनाता है। मैंने देखा कि स्मृति उपयोग बढ़ता है क्योंकि यह चलता है और अंततः स्मृति से बाहर चला जाता है। लेकिन वही कोड मेरे सहकर्मी के पर्यावरण पर स्मृति को रिसाव नहीं करता है। हम दोनों के पास समान नेट संस्करण है। मैं इस मुद्दे को निम्नलिखित नमूना कोड के साथ पुन: उत्पन्न करने में सक्षम था जो मेरे सहकर्मी के लैपटॉप पर रिसाव नहीं करता है बल्कि मेरे लैपटॉप पर करता है।नेट मेमोरी लीक बहुत सारे थ्रेड बनाते समय

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);    
    } 
} 

जब मैं ऊपर चलाने के लिए, यह प्रिंट निम्नलिखित

Version 4.0.30319.18063 
32 

Visual Studio 2012 परियोजना के लिए लक्ष्य ढांचे में .NET Framework 4.5 है। परियोजना विन्यास

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

निम्नलिखित के साथ स्मृति लीक अगर मैं पसंद करते हैं 32-बिट अनचेक, यह लीक नहीं करता है।

एक और विन्यास कि स्मृति लीक

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

जिसके परिणामस्वरूप निष्पादन योग्य है कि मेरे लैपटॉप पर लीक मेरी सहकर्मी के लैपटॉप पर लीक नहीं करता है।

मैं मेमोरी लीक खोजने के लिए CLR प्रोफाइलर इस्तेमाल किया, लेकिन यह कुछ भी है कि लीक कर रहा है नहीं दिखाती है। लेकिन मुझे लगता है कि विंडोज संसाधन मॉनीटर में काम करने वाला सेट लगभग 1 एमबी/सेकेंड तक बढ़ता है।

क्या स्मृति उपयोग मेरी पर्यावरण पर 32-बिट मोड में वृद्धि करने के लिए नहीं बल्कि मेरे सहकर्मी का कारण है?

+1

जब मैं अपने पीसी पर इस कोशिश FWIW मैं अपने सहकर्मी के रूप में (कोई रिसाव) एक ही व्यवहार मिलता है। – Cameron

+0

और आपका सहकर्मी किस संस्करण को चलाता है? –

+1

[umdh उपकरण] उपयोग करने का प्रयास (https://msdn.microsoft.com/en-us/library/windows/hardware/ff560206%28v=vs.85%29.aspx) (32-बिट स्थापित करने के लिए सुनिश्चित हो विंडोज़ के लिए डिबगिंग टूल्स) यह देखने के लिए कि सभी मेमोरी आवंटित कौन कर रहा है। इसके अलावा, क्या होता है यदि आप थ्रेड विधि के अंदर नींद को हटाते हैं? – Cameron

उत्तर

-2

आपको एक ही समय में चल रहे एक साथ थ्रेड की संख्या सीमित करनी चाहिए और शायद आप थ्रेड पूल का उपयोग कर सकते हैं, ताकि आप जो फ़ील्ड आकार को जोड़ते हैं और उससे अधिक हो गए थ्रेड को कतारबद्ध कर सकें।

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

0

मैं सभी टिप्पणियों को पढ़ने और डर है कि मेरी टिप्पणी वहाँ खो जाएगा, इसलिए जवाब देने की कोशिश की है।

उपयोग स्मृति प्रोफाइलर NET अनुप्रयोगों, जेटब्रेन्स dotMemory या चींटियों या जो कुछ भी लेकिन WinDBG या कार्य प्रबंधक या अन्य देशी स्मृति उपकरणों के लिए बनाया गया।

आप तुलना कर सकते हैं कि एप्लिकेशन ने आपके पर अपने सहयोगी के लैपटॉप बर्ताव करता है और चुने हुए प्रोफाइलर का वास्तविक समय चार्ट का उपयोग कर। मुझे लगता है कि आप देखेंगे कि आपके लैपटॉप पर मेमोरी उपयोग लगातार बढ़ता है - बस एक मेमोरी स्नैपशॉट प्राप्त करें और देखें कि कितने थ्रेड ऑब्जेक्ट्स मेमोरी में हैं, कौन सी ऑब्जेक्ट्स मेमोरी का अधिकतर हिस्सा लेती हैं और जांच करती हैं कि क्यों और वे स्मृति में क्यों हैं।

संबंधित मुद्दे