2009-07-24 14 views
6

मेरा ऐप 150 एमबी मेमोरी का उपयोग कर रहा था, बहुत पहले नहीं, अब यह 286 एमबी पर है। यह धीरे-धीरे बढ़ता है इसलिए मुझे कुछ निपटाने के लिए भूल जाना चाहिए। मेरे पास यह समस्या बहुत अधिक नहीं है क्योंकि मेरे पास 4 जीबी है लेकिन मैं इसे अन्य लोगों को भेजना चाहता हूं जिनके पास केवल 1 जीबी रैम है। अन्य तो लाइन लाइन के माध्यम से लाइन लाइन के माध्यम से जा रहा है मैं उन वस्तुओं को कैसे ढूंढ सकता हूं जिन्हें निपटाने की आवश्यकता है या आमतौर पर बड़ी वस्तुएं?निपटान और स्मृति समस्याओं को कैसे ढूंढें? सी #

उत्तर

2

बाहर .NET Memory Profiler चेक। 15-दिवसीय परीक्षण है और यह लाइसेंस शुल्क के लायक है।

आसानी इकट्ठा करके मेमोरी लीक की पहचान करने और नेट स्मृति स्नैपशॉट की फोटो की तुलना डेटा नेट उदाहरण आवंटन और समय स्नैपशॉट एकत्र किया गया था पर लाइव उदाहरणों के बारे में शामिल हैं। वे उपयोगी जानकारी का एक बहुत प्रदान करते हैं और यह आसान संभावित स्मृति लीक पहचान करने के लिए, खासकर जब दो स्नैपशॉट तुलना में कर रहे हैं।

1

तुम भी WinDbg और एसओएस का उपयोग कर सकते हैं। इनका उपयोग करने में थोड़ा मुश्किल होने पर इनके पास मुफ्त और बहुत, बहुत गहन होने का लाभ होता है।

यहाँ एक blog post प्रक्रिया का वर्णन है।

+2

विंडबग और एसओएस भी मेरे एफएवी हैं। रिको मारियानी से एक बहुत पुराना ब्लॉग पोस्ट है: http://blogs.msdn.com/ricom/archive/2004/12/10/279612.aspx –

+0

वह पोस्ट था जिसने मुझे मूल रूप से एसओएस पर लगाया ... लेकिन जिसे मैंने पोस्ट किया है, मुझे लगता है कि इसका पालन करना थोड़ा आसान है। –

4

दोनों जेपी और रीड के उत्तरों को विस्तारित करना।

मैं थोड़ा उलझन को साफ़ करना चाहता था। यदि आप स्मृति में महत्वपूर्ण वृद्धि देख रहे हैं तो समस्या निपटाने के साथ समस्या होने की संभावना नहीं है। निपटान आमतौर पर हैंडल जैसे अप्रबंधित संसाधनों को मुक्त करने के लिए उपयोग किया जाता है। ये बहुत मेमोरी नहीं लेते हैं बल्कि संसाधनों के रूप में अधिक मूल्यवान हैं। स्मृति में

वृद्धि आम तौर पर बड़ी वस्तुओं या संग्रह सुलभ होने से एक प्रबंधित वस्तु एक ढेर वस्तु या एक मजबूत जीसी संभाल के माध्यम से प्रत्यक्ष या परोक्ष रूप निहित किया जा रहा से जुड़े रहे हैं। यह वह क्षेत्र है जहां आप अपनी जांच पर ध्यान केंद्रित करना चाहते हैं।

+0

हां, यह एक महान बिंदु है। मैं स्मृति प्रोफाइलर का उपयोग करता हूं जैसे कि "ओह, यह संग्रह बड़ा और बड़ा नहीं होना चाहिए!" :) –

+2

इसके अलावा, आप जिस भी घटना की सदस्यता लेते हैं उस पर एक अच्छी नज़र डालें। घटना में ग्राहक का संदर्भ होता है, और यदि आप कभी सदस्यता नहीं लेते हैं, तो वह संदर्भ कभी नहीं हटाया जाता है। – JulianR

0

चेक बाहर this link

स्टीफन Toub महान लंबाई में चला जाता है के बाद अपने लेख

  • से कुछ संक्षिप्त प्रकाश डाला जाता है, ऐसा करने के लिए विभिन्न तकनीकों की व्याख्या करने के एक finalizer जोड़ कर डिबगिंग उद्देश्यों के लिए, आप को पता लगाने के लिए एक तरीका पेश कर सकते हैं कि एक वर्ग ठीक तरह से निपटान नहीं किया गया था, अगर अंतिमकर्ता कभी नहीं बुलाया जाता है, तो आप डब्ल्यू कि निपटारा

  • आमंत्रित नहीं किया गया उदाहरण बारे में अतिरिक्त जानकारी प्राप्त करने के लिए, threadIds आदि नीचे जो उदाहरण यह लागू निपटाया है नहीं था सीमित करने में सहायता करने के लिए, वह एक FinalizationDebgger वर्ग बनाता जो आपके डिस्पोजेबल वर्ग होगा अंतिमकरण डिबगर वर्ग उदाहरण का निपटान जब इसे स्वयं निपटाया जाता है तो उसे रोकें। निपटान अपनी कक्षा उदाहरण पर बुलाया नहीं है, तो फिर जब finalizer चलाता है यह FinalizationDebgger उदाहरण जहां में आप का दावा है या समस्या डिबग मदद करने के लिए एक अपवाद फेंक सकता है,

  • ले जाएँ सभी ट्रैकिंग के लिए finalizer लागू करेगा एक बेस क्लास में संबंधित कोड जो आपकी डिस्पोजेबल क्लास होगा, तब से प्राप्त होगा, जिससे कोड अधिक क्लीनर बन जाएगा। यह दृष्टिकोण काम कर सकता है या नहीं, क्योंकि आप बेस क्लास को जलाते हैं और यदि आप पहले से ही किसी अन्य आधार से विरासत में हैं।

  • अंतिम विकल्प में सब कुछ एक स्थिर वर्ग में फैला हुआ है कि आपके उदाहरण कॉल करें। FinalizationDebugger एक स्थिर वर्ग बन जाता है जो तीन स्थिर विधियों का खुलासा करता है: कन्स्ट्रक्टर, डिस्प्ले और फ़ाइनलाइज़र। विचार यह है कि आप इन वर्गों को को अपनी कक्षा (निपटान/अंतिम रूप/कन्स्ट्रक्टर) में उचित स्थान से कॉल करते हैं। यह आपके कोड में कम से कम आक्रामक है, क्योंकि इसमें आमतौर पर कोड की केवल तीन पंक्तियां शामिल होती हैं। इन विधियों के सभी को एक ConditionalAttribute के साथ चिह्नित किया गया है, जैसे कि जब आप अपनी कक्षा को DEBUG मोड में संकलित करते हैं तो उन्हें केवल कहा जाएगा।

स्टीफन भी अपने प्रत्येक दृष्टिकोण के पेशेवरों और विपक्ष को समझाता है। समाधान विभिन्न विकल्पों को प्रस्तुत करते हैं और आपको यह पता लगाने के लिए प्रत्येक का मूल्यांकन करना होगा कि आपकी स्थिति के लिए कौन सा सबसे अच्छा काम करता है। एक पढ़ना चाहिए IMHO

उम्मीद है कि इससे मदद मिलती है।

+0

वोट उठाने के लिए उत्तर को बेहतर भरने की आवश्यकता है। लिंक पर इंगित करना पर्याप्त कारण नहीं है यदि लिंक डॉन जाता है तो यह अब एक उपयोगी उत्तर नहीं है। –

+0

एमएसडीएन आलेख में जो कवर किया गया है उसका संक्षिप्त सारांश शामिल करने के लिए उत्तर को संपादित करने के लिए पर्याप्त मेला –

0

ANTS Memory Profiler को भी आजमाएं। एक 14 दिन पूरी तरह कार्यात्मक नि: शुल्क परीक्षण है, और मुझे वास्तव में यूआई पसंद है।

प्रकटीकरण: वे अभी हेर्डिंग कोड प्रायोजित करते हैं, इसलिए मैंने इसे आजमाया। लेकिन मैं इसके साथ वास्तव में प्रभावित हूं - मैंने 30 घंटों के लिए आवेदन किया और इसके बारे में बहुत उपयोगी जानकारी मिली। यूआई वास्तव में सहायक है - यह आपको प्रक्रिया के माध्यम से मार्गदर्शन करता है, और यह डांग शुद्ध दिखता है।

alt text http://www.red-gate.com/products/ants_memory_profiler/images/object_retention_graph.gif

0

यहाँ ANTS Memory Profiler का उपयोग कर मदद विमुखता वाला वस्तुओं खोजने के लिए और लीक ठीक करने के लिए चाल की जोड़ी है।

  1. चींटियों मेमोरी प्रोफाइलर एक फिल्टर स्थापित किया जाना है कि बस वस्तुओं है कि एक निपटान() विधि दिखाएँ जिनमें अनुमति देता है। इसे चालू करें, और आप होंगे जो जीवित वस्तुओं की एक सूची दी गई है जिन्हें निपटान नहीं किया गया है।

  2. अनजान वस्तुओं को ढूंढना उपयोगी है, और भी उपयोगी है यह जानना कि इन वस्तुओं का निपटारा क्यों नहीं किया जा रहा है। यह पता लगाना कि अनजान ऑब्जेक्ट्स बनाए गए हैं, रिसाव के कारण को खोजने का एक लंबा सफर तय करता है। यदि आप लीकिंग ऑब्जेक्ट का कोड बदल सकते हैं, तो उपयोगी चाल स्टैकट्रैस रखने के लिए फ़ील्ड को पेश करना है, और ऑब्जेक्ट निर्माण के समय इस क्षेत्र को पॉप्युलेट करना है। फिर एएनटीएस मेमोरी प्रोफाइलर आपको ऑब्जेक्ट्स के फ़ील्ड का निरीक्षण करने की अनुमति देता है, आप केवल स्टैकट्रैक को पढ़ सकते हैं क्योंकि लीकिंग ऑब्जेक्ट्स बनने के समय ही था। यह आपको एक मजबूत सुराग देगा कि लीकिंग ऑब्जेक्ट्स का मालिक होना चाहिए, और उन्हें उन वस्तुओं पर निपटान करने के बारे में कैसे जाना चाहिए जिनके लिए वे ज़िम्मेदार हैं।

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