2010-01-19 16 views
5

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

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

इस कोड "रिसाव" या किसी भी तरह कचरा कलेक्टर चाल करेंगे:

- (void)meh 
{ 
    NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"holmes" ofType:@"txt"]]; 
    const int substrLength = 80; 

    for (const char *substr = [data bytes]; substr-(const char *)[data bytes] < [data length]; substr += substrLength) { 
     NSString *cocoaString = [[NSString alloc] initWithBytes:substr length:substrLength encoding:NSUTF8StringEncoding]; 
     [cocoaString length]; 
    } 
} 

मैं इस घड़ी में गतिविधि मॉनिटर के साथ साथ ही रख सकते हैं और सिर्फ स्मृति के उपयोग को देखने के ऊपर जाना और जीसी मॉनिटर साधन के साथ के रूप में । (holmes.txt 594 केबी है)

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

Project zip

यहां केवल बढ़ रही है और बढ़ रही वस्तु ग्राफ की एक तस्वीर है:

alt text

+0

जब मैं इसे चलाता हूं तो मैं किसी भी रिसाव को देखने में सक्षम नहीं हूं, यह कई मिनट चलने के बाद 7.5 एमबी और 9 एमबी मेमोरी उपयोग के बीच हो जाता है। –

+0

यह अजीब है। मैं 10.6.2 पर हूं। मैं डीबग और रिलीज में बनाया गया। मैं सभी मामलों में हमेशा बढ़ती-स्मृति देखता हूं। wtf ... – Sean

+0

अब मेरे पास 10.5 रन पर कोई और है, और वह रिपोर्ट करता है कि यह उसके लिए बढ़ रहा प्रतीत नहीं होता है। मुझे कोशिश करने के लिए किसी और को 10.6+ पर प्राप्त करने की आवश्यकता है। – Sean

उत्तर

13

यह एक दुर्भाग्यपूर्ण बढ़त मामला है। कृपया एक बग फ़ाइल करें (http://bugreport.apple.com/) और अपना उत्कृष्ट न्यूनतम उदाहरण संलग्न करें।

समस्या दो गुना है;

  • मुख्य ईवेंट लूप नहीं चल रहा है और इस प्रकार, संग्राहक एमईएल गतिविधि के माध्यम से ट्रिगर नहीं किया जाता है। यह कलेक्टर को अपनी सामान्य पृष्ठभूमि केवल थ्रेसहोल्ड आधारित संग्रह कर देता है।

  • डेटा डेटा से डेटा को मैलोक ज़ोन से आवंटित एक malloc'd बफर में संग्रहीत करता है। इस प्रकार, जीसी ने आवंटन - एनएसडीटा ऑब्जेक्ट स्वयं ही लिखा - वास्तव में छोटा है, लेकिन वास्तव में कुछ बड़ा (मॉलोक आवंटन) को इंगित करता है। अंत परिणाम यह है कि कलेक्टर की दहलीज हिट नहीं होती है और यह एकत्र नहीं होती है। जाहिर है, इस व्यवहार में सुधार वांछित है, लेकिन यह एक कठिन समस्या है।

माइक्रो-बेंचमार्क या अलगाव में पुन: उत्पन्न करने के लिए यह एक बहुत ही आसान बग है। व्यावहारिक रूप से, आम तौर पर यह चल रहा है कि यह समस्या नहीं होगी। हालांकि, कुछ ऐसे मामले हो सकते हैं जहां यह समस्याग्रस्त हो जाए।

इस पर अपना कोड बदलें और संग्राहक डेटा ऑब्जेक्ट्स एकत्र करेगा। ध्यान दें कि आपको अक्सर collectExhaustively का उपयोग नहीं करना चाहिए - यह सीपीयू खाता है।

- (void)meh 
{ 
    NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"holmes" ofType:@"txt"]]; 
    const int substrLength = 80; 

    for (const char *substr = [data bytes]; substr-(const char *)[data bytes] < [data length]; substr += substrLength) { 
     NSString *cocoaString = [[NSString alloc] initWithBytes:substr length:substrLength encoding:NSUTF8StringEncoding]; 
     [cocoaString length]; 
    } 
    [data self]; 
    [[NSGarbageCollector defaultCollector] collectExhaustively]; 
} 

[data self] डेटा इसे करने के लिए अंतिम संदर्भ के बाद जिंदा आपत्ति रहता है।

+0

स्पष्टीकरण और संभावित कामकाज के लिए बहुत बहुत धन्यवाद। दायर रडार: // 556417। – Sean

+1

धन्यवाद - रडार: // 7556417, बीटीडब्ल्यू। – bbum

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