2014-10-16 2 views
9

मैं किसी डिवाइस पर उपकरणों का उपयोग कर रहा हूं ताकि यह पता लगाने की कोशिश की जा सके कि मेरे पास कोई स्मृति लीक या छोड़ा गया है या नहीं। विशेष रूप से मैं लीक और आवंटन का उपयोग कर रहा हूँ। जबकि उपकरण किसी भी रिसाव को इंगित नहीं करते हैं, इसका मतलब यह नहीं है कि मेरे पास स्मृति समस्याएं नहीं हैं। मैं इस पर हफ्तों तक काम कर रहा हूं, और मुझे यह पता लगाने के करीब नहीं लगता कि मेरे पास कौन से मुद्दे हैं (यूघ)।उपकरण और ढेर वृद्धि, जब विकास वास्तव में एक रिसाव है?

मैं कार्रवाई के बाद एक heapshot लेने और दोहराते हुए एक विशेष कार्य के परीक्षण कर रहा हूँ। पहली कुछ "निपटान" पीढ़ियों के बाद, मैं देख सकता हूं कि विकास और लगातार गिनती सभी एक निश्चित संख्या (कई केबी) पर शुरू होती है। कई बार दोहराए गए पुनरावृत्तियों के बाद (10-20 कहें), कुछ (सभी नहीं) धीरे-धीरे 0 तक निकलते हैं। इसमें कुछ समय लगता है, लेकिन ऐसा होता है। पीढ़ियों जहां लगातार स्मृति बनी रहती है, वास्तव में मुझे कुछ भी नहीं दिखाती है जो मुझे सहायक लगता है, क्योंकि स्टैक ट्रेस सभी सिस्टम लाइब्रेरी दिखाता है।

तो मेरी प्रश्न हैं:

  1. व्यवहार के इस प्रकार क्या दर्शाता है? क्या मुझे स्मृति समस्याएं हैं? क्या कहीं स्मृति की कुछ आलसी रिलीज है?
  2. निरंतर स्मृति दिखाने वाले पुनरावृत्तियों के समुद्र में, एक शून्य ढेर वृद्धि पुनरावृत्ति का क्या मतलब है?
  3. केवल प्रणाली पुस्तकालयों के लिए एक विशेष पीढ़ी अंक के लिए स्टैक ट्रेस, इसका मतलब यह होता है, तो उस पीढ़ी के लिए ढेर विकास वैध है या वहाँ एक बग है कि? या फिर भी इसका मतलब यह हो सकता है कि मेरे अंत में स्मृति पर कुछ है?
  4. स्टैक ट्रेस आपकी लाइब्रेरी और विधि को दिखाता है, इसका मतलब क्या है, लेकिन यह सिस्टम कोड की तरह गहरा हुआ है और इसमें थोड़ा सा घर आइकन है, आपकी लाइब्रेरी के साथ बनाम ए लाइन और विधि जो काला है और इसमें थोड़ा सा व्यक्ति है आइकन?
  5. यदि मेरे पास एक बनाए रखने चक्र की तरह कुछ है - लगातार विकास लगातार नहीं होगा?

अंतर्दृष्टि का कोई भी जवाब बेहद सहायक होगा!

+0

क्या आपको यह पता चला? बहुत सारे नए नियंत्रकों को आवंटित करते समय मैं वही चीज़ देख रहा हूं। –

+1

कुछ समय के लिए संघर्ष करने के बाद, मुझे लगा कि 20-30 पुनरावृत्तियों के बाद भी एक शून्य ढेर वृद्धि एक संकेत था कि कुछ सही था और आगे बढ़ गया। मेरे द्वारा किए गए सभी आवंटन सिस्टम पुस्तकालयों से थे, और जो स्मृति अर्जित कर रही थी वह बहुत अधिक नहीं थी। अच्छा जवाब नहीं, मुझे पता है। अगर कोई और उसमें झुक सकता है तो वह बहुत अच्छा होगा। – dragonflyesque

+0

आपके पास कहीं सख्त लूप हो सकता है जहां चीजें पर्याप्त तेज़ी से मुक्त नहीं होती हैं। @autorelease – uchuugaka

उत्तर

1

मुझे आपके प्रश्नों पर एक चाकू ले लेंगे:

व्यवहार के इस प्रकार क्या दर्शाता है? क्या मुझे स्मृति समस्याएं हैं? कहीं स्मृति की कुछ आलसी रिलीज है?

जब से तुम कैसे प्रणाली चौखटे उनके निजी स्मृति आवश्यकताओं को प्रबंधित करने में पता नहीं कर सकते हैं, तो आप यह मान लेना चाहिए कि हाँ, वहाँ, आलसी/आस्थगित स्मृति की रिहाई किसी भी समय आप प्रणाली चौखटे में फोन हो रहा हो सकता है जो सबसे अधिक में ऐप्स "हर समय" है। इसे बाहर शासन करने में सक्षम नहीं किया जा रहा से परे, मैं कुछ निश्चितता के साथ कह सकते हैं कि वहाँ निश्चित रूप से लंबे समय तक रहा प्रतीत होता है-अहानिकर प्रणाली ढांचे के उपयोग से शुरू हो रहा आवंटन कर रहे हैं। (उदाहरण के लिए this answer में UIWebView के लंबे समय से रहते थे स्मृति उपयोग की चर्चा देखें।)

पुनरावृत्तियों कि लगातार स्मृति दिखाने के समुद्र में, एक शून्य ढेर विकास यात्रा क्या मतलब है?

कहना मुश्किल है। एक अच्छा पहला ऑर्डर अनुमान यह हो सकता है कि पुनरावृत्ति से जुड़ी ढेर वृद्धि किसी भी तरह से पिछले पुनरावृत्ति के लिए आवंटित स्मृति की आलसी/स्थगित रिलीज द्वारा बिल्कुल ऑफसेट हो गई थी।

एक विशेष पीढ़ी अंक केवल प्रणाली पुस्तकालयों के लिए के लिए स्टैक ट्रेस, इसका मतलब यह होता है, तो यह है कि पीढ़ी के लिए ढेर विकास वैध है या वहाँ एक बग है कि? या फिर भी इसका मतलब हो सकता है कि मेरे अंत में स्मृति पर कुछ हो रहा है?

यदि उपकरण ढेर वृद्धि दिखाते हैं, तो ढेर वृद्धि लगभग निश्चित रूप से मौजूद है। चाहे ढेर वृद्धि कुछ ऐसा हो जो आपके प्रत्यक्ष नियंत्रण पर निर्भर करता है। यदि आप सिस्टम ढांचे (संभवतः नहीं) में कोई कॉल नहीं करते हैं, तो यह निश्चित रूप से आपकी गलती है। एक बार जब आप सिस्टम ढांचे में कॉल कर लेंगे, तो आपको यह संभावना स्वीकार करनी होगी कि ढांचा आपके कॉल रिटर्न के बाद आवंटित स्मृति को आवंटित कर सकता है।

क्या करता है तो इसका मतलब यह है जब स्टैक ट्रेस अपने पुस्तकालय और विधि से पता चलता है, लेकिन यह प्रणाली कोड की तरह सलेटी रंग है और एक छोटे से घर आइकन है, बनाम अपने पुस्तकालय और विधि में है कि के साथ आ लाइन काला और थोड़ा व्यक्ति आइकन है?

लाइन्स आउट ग्रेइंग आउट इंगित करता है कि उपकरण के उस लाइन के लिए डीबग प्रतीक नहीं हैं। बस इतना ही। यह स्मृति उपयोग के संबंध में विशिष्ट कुछ भी इंगित नहीं करता है।

यदि मेरे पास एक बनाए रखने चक्र की तरह कुछ है - लगातार वृद्धि संगत नहीं होगी?

प्रत्येक यात्रा एक नई वस्तु ग्राफ चक्रीय साथ बरकरार रखे हुए बनाया है, तो हां, तो आप उम्मीद करेंगे कि प्रत्येक यात्रा कम से कम उस वस्तु ग्राफ के आकार से ढेर वृद्धि का कारण होगा। उस ने कहा, छोटे शोर ग्राफ आसानी से "शोर" में खो जा सकते हैं। यदि आपको संदेह है, तो एक तरीका यह है कि "संदिग्ध" वर्ग की वस्तुएं एक विशाल आवंटन करती हैं जो उन्हें "शोर" से बाहर खड़ा कर देगी। उदाहरण के लिए, प्रत्येक ऑब्जेक्ट के लिए अपनी ऑब्जेक्ट malloc मेगाबाइट (या अधिक) बनाएं (और जाहिर है, जब इसे आवंटित किया जाता है तो इसे मुक्त करें।) यह समस्या क्षेत्रों को वहां से बाहर निकलने में मदद कर सकता है जहां वे मूल रूप से नहीं हो सकते हैं।

+0

आपके सभी संपूर्ण उत्तरों के लिए धन्यवाद! मैं आपके द्वारा सुझाए गए डिबगिंग विधि का प्रयास करूंगा और अपने परिणामों के साथ वापस आऊंगा। – dragonflyesque

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