मैं अपने आवेदन के विभिन्न निर्माण के साथ कुछ समय खेल रहा हूं और ऐसा लगता है कि अजीब चीजें होती हैं:कोको 64 बिट बाइनरी रिसाव स्मृति? (एनएसडीटा जारी करने से स्मृति मुक्त नहीं होता है)
मेरे ऐप में 5 एमबी निष्क्रिय पदचिह्न है। फ़ाइल के आकार में फ़ाइल मेमोरी अपलोड करते समय आरक्षित है। अपलोड के बाद आरक्षित स्मृति मुक्त होनी चाहिए। अब निर्माण में अंतर हैं (जीसी = कचरा कलेक्टर):
- 32 बिट i386 नो-जीसी: सभी मेमोरी तुरंत मुक्त हो जाती है।
- 32 बिट i386 जीसी: लगभग सभी स्मृति तुरंत मुक्त हो जाती है। बाकी कुछ समय बाद।
- 64 बिट x86_64 नो-जीसी: न्यूनतम स्मृति मुक्त हो जाती है। जैसे 10%
- 64 बिट x86_64 जीसी: बिल्कुल कोई स्मृति मुक्त नहीं है। स्मृति घंटों तक आरक्षित रहता है। (गतिविधि सोम)
मैं CLANG के साथ एलएलवीएम का उपयोग कर रहा हूं। मैं हर समय उपकरणों को चला रहा हूं और लीक/लाश/आदि की जांच कर रहा था। और सबकुछ साफ दिखता है। (ऐप अपेक्षाकृत सरल है।)
क्या इस व्यवहार के लिए कोई स्पष्टीकरण है?
अद्यतन:
कुछ अजीब सामान है कि। मैंने इस समस्या को उबलाया है:
मैं एक एनएसडीटा में 20 एमबी फ़ाइल लोड करता हूं और इसे छोड़ देता हूं। मैं बिना किसी कचरा संग्रह सक्षम कर रहा हूं। कोड है:
NSData *bla = [[NSData alloc] initWithContentsOfFile:@"/bigshit"];
[bla release];
जब मैं i386 32 बिट के लिए 20 एमबी आवंटित और रिलीज़ किया जाता हूं। जब मैं बिल्ड को 64 बिट x86_64 पर स्विच करता हूं तो रिलीज़ कुछ भी नहीं करता है। 20 एमबी आवंटित किया गया।
upper pic 32bit lower 64 http://kttns.org/zguxn
सिवाय इसके कि ऊपरी एक 32 बिट के लिए बनाया गया है दो क्षुधा के बीच कोई अंतर और कम एक 64 बिट है। कोई जीसी चल रहा है। (जीसी के साथ एक ही समस्या दिखाई देता है सक्षम होना चाहिए।)
अद्यतन 2:
वही व्यवहार मनाया जा सकता है जब मैं केवल applicationDidFinishLaunching में ऊपरी कोड के साथ शुरू से एक नई कोको ऐप बनाने :. 64 बिट मोड में स्मृति जारी नहीं है। i386 अपेक्षित काम करता है।
एनएसडीटा के बजाय एनएसएसटींग के साथ एक ही समस्या दिखाई देती है। यह तब भी प्रकट होता है जब मैं 64 बिट कर्नेल बूट करता हूं। (स्टार्टअप पर 64 होल्डिंग।)
ओएस 10.6.0
क्या आपने स्मृति को देखने के लिए कई एनएसडीटा उदाहरणों को आवंटित करने और हटाने की कोशिश की है या नहीं उनमें से किसी के लिए पुनः दावा किया गया है? ऐसा हो सकता है कि प्रोग्राम स्मृति की कमी होने तक स्मृति को ओएस पर वापस नहीं लौटाता है। – Amok
मैंने बस भाग्य के बिना 10.6 पर इसे पुन: उत्पन्न करने की कोशिश की। क्या आपने अपने परीक्षण ऐप के साथ एक बग दायर की है? – Ken
आपका ऐप सही तरीके से व्यवहार कर रहा है और स्मृति को लीक नहीं कर रहा है। अर्ध-विस्तृत स्पष्टीकरण के लिए नीचे मेरा उत्तर देखें। – bbum