2010-06-01 14 views
5

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

अद्यतन:

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

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

+0

यदि आप खुले/बंद/खुले/बंद खुले/बंद करते हैं तो यह प्रत्येक बार खुले/बंद होने पर कुछ और एमबी खाता है या यह पहले प्रयास के बाद बस एक निश्चित आकार तक पहुंचता है। आप स्मृति का उपयोग कैसे कर रहे हैं? –

उत्तर

2

इस धारणा से कार्य करना कि वास्तव में यह रैम है जिसे आपने मापा है: सुनिश्चित करें कि यह पूरी तरह से सामान्य है। आपका प्रोग्राम सक्रिय रूप से दस्तावेज़ लोड करते समय वर्चुअल मेमोरी पेज को संबोधित कर रहा है, वे रैम में मैप किए जाएंगे। वे तब तक वहां रहेंगे जब तक कि किसी अन्य प्रक्रिया को रैम पर मैप किए जाने वाले पृष्ठों की आवश्यकता न हो। कुछ ऑपरेटिंग सिस्टम काम पर सेट को पूर्व-खाली तरीके से ट्रिम करते हैं, उदाहरण के लिए जब ऐप की खिड़कियां कम हो जाती हैं।

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

+0

उपयोगी टिप्पणियां - मैंने इसे नहीं माना था। शायद मुझे एक टेस्ट केस चलाने की ज़रूरत है जहां ऐप बार-बार फाइलें खोलने और बंद करने के लिए फाइलों को बंद कर देगा, यह देखने के लिए कि क्या यह वास्तव में अधिक मेमोरी आवंटित कर रहा है या यह पेजिंग का सिर्फ एक कर्कश है या नहीं। प्रक्रिया एक्सप्लोरर द्वारा रिपोर्ट किए गए मूल्य को 'निजी बाइट्स' है। –

+0

यह वर्चुअल मेमोरी है, रैम नहीं। इसमें ढेर में मुफ्त ब्लॉक शामिल हैं। –

2

अच्छा, वास्तव में आपके पास रिसाव है। जब एप्लिकेशन ओएस से बाहर निकलता है तो सभी संसाधनों को साफ़ कर दिया जाता है: इस एप्लिकेशन में कोई भी एप्लिकेशन लीक नहीं होता है जो छोड़ने के बाद स्मृति को स्थायी रूप से आवंटित करता है। एक्सकोड में लीक की पहचान करने में आपकी सहायता करने के लिए एक टूल है।

Run->Run with performance Tool->Leaks
के तहत देखें जो आपके आवेदन को कोड के साथ चलाएगा जो आपको लीक खोजने में मदद करेगा।

+0

मैं भूल गया: यह आपको एक दृश्य उपकरण भी देगा, यह देखने के लिए कि क्या लीक किया गया है और कॉल स्टैक जो रिसाव की ओर ले जाता है। – garph0

+0

मैंने उल्लेख किया कि मैंने पहले ही लीक्स चलाया है और इसे कोई समस्या नहीं मिली है। मेमोरी को एप्लिकेशन के अंदर कैश द्वारा आवंटित किया जाता है, और एप्लिकेशन से बाहर निकलने पर कैश को ठीक से मुक्त किया जा रहा है। मेरा सवाल यह है कि मुझे कैसे पता चलेगा कि कौन सी विशेष कैश सभी मेमोरी के लिए लेखांकन कर रही है ताकि जब मैं दस्तावेज़ बंद कर दूं तो मैं इसे फ्लश कर सकता हूं? –

+0

मेरा बुरा: मुझे एहसास नहीं हुआ कि आपका मतलब एक्सकोड लीक्स प्रदर्शन उपकरण था। क्या यह विजुअल लीक डिटेक्टर या मैक लीक था? – garph0

4

यदि आप विश्वसनीय रूप से इसे पुन: उत्पन्न कर सकते हैं तो आप इसे समस्या निवारण के लिए एमएस सीआरटी में डीबग ढेर का उपयोग करने में सक्षम होना चाहिए। यहां प्रारंभ करें: Memory Leak Detection and Isolation

+0

मैं कोशिश कर सकता हूं - मैंने कुछ वर्षों तक एमएस सीआरटी दिनचर्या का उपयोग करने की कोशिश नहीं की है क्योंकि यह मामला होता था कि उन्होंने हमारे कोडबेस के साथ निर्माण नहीं किया था। मुझे लगता है कि यह 'प्लेसमेंट न्यू' के उपयोग की तरह कुछ था जो इसे पसंद नहीं आया था। –

0

किसी के लिए सहायक हो सकता है। मुझे लगा कि ज़ोंबी ऑब्जेक्ट्स डिटेक्शन सक्रिय (सक्रिय रूप से योजना संपादन में एक चेकबॉक्स) के साथ एक्सकोड 4.2 एक पागल की तरह स्मृति खाता है - एक मिनट में ~ 4 जीबी। बस यह सुनिश्चित करना सुनिश्चित करें कि आपका ऐप एक्सकोड के तहत मेमोरी चला रहा है और अन्यथा नहीं। मेमोरी आवंटन और रिसाव उपकरण भी कुछ भी नहीं देता है।

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