iPhone ओएस मेमोरी चेतावनी। विभिन्न स्तरों का क्या मतलब है?


85

IPhone OS उपकरणों पर स्मृति को प्रबंधित करने की काली कला के बारे में: स्मृति चेतावनी के विभिन्न स्तरों का क्या मतलब है। स्तर 1? लेवल 2? क्या डायल ११ पर जाता है?

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

धन्यवाद,
डौग

जवाबों:


98

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


25
LOL "यदि आप कुछ ऐसी मेमोरी मुक्त कर सकते हैं जो आप सक्रिय रूप से उपयोग नहीं कर रहे हैं तो वह प्रफुल्लित हो जाएगी!" अनमोल ;-) चीयर्स
डुगला

15
आप iPhone OS wack-a-तिल मेमोरी डांस के एक गंभीर अनुभवी की तरह लग रहे हैं।
दुगला

193

मैमोरी लेवल चेतावनियाँ स्प्रिंगबोर्ड द्वारा लॉग की जाती हैं। एक ऐप डेवलपर के रूप में आपको इसकी देखभाल करने की आवश्यकता नहीं है। बस जवाब देना -{application}didReceiveMemoryWarningकाफी है।


चेतावनी के 4 स्तर हैं (0 से 3)। ये कर्नेल मेमोरी वॉचर से सेट किए गए हैं, और यह नहीं-तो-सार्वजनिक फ़ंक्शनOSMemoryNotificationCurrentLevel() द्वारा प्राप्त किया जा सकता है ।

typedef enum {
    OSMemoryNotificationLevelAny      = -1,
    OSMemoryNotificationLevelNormal   =  0,
    OSMemoryNotificationLevelWarning  =  1,
    OSMemoryNotificationLevelUrgent   =  2,
    OSMemoryNotificationLevelCritical =  3
} OSMemoryNotificationLevel;

स्तरों को कैसे ट्रिगर किया जाता है इसका दस्तावेजीकरण नहीं किया गया है। स्प्रिंगबोर्ड को प्रत्येक मेमोरी स्तर में निम्नलिखित करने के लिए कॉन्फ़िगर किया गया है:

  1. चेतावनी (सामान्य नहीं) - गैर-वाजिब बैकग्राउंड ऐप्स जैसे मेल को रिले, या देरी ऑटो रिले।
  2. अर्जेंट - सभी बैकग्राउंड ऐप्स को छोड़ दें, जैसे सफारी और आईपॉड।
  3. महत्वपूर्ण और इससे परे - कर्नेल पर कब्जा कर लेंगे, शायद स्प्रिंगबॉर्ड को मार देंगे या यहां तक ​​कि रिबूट भी कर सकते हैं।

सक्रिय अनुप्रयोग (रोड़ी) स्प्रिंगबोर्ड द्वारा नियंत्रित नहीं है हत्या है, लेकिन launchd


इसके लिए धन्यवाद। यह इस सवाल पर आपके और विलीहाम के हास्य अभिनेता के बीच टॉस था। हास्य जीतता है। चीयर्स।
दुगला

नमस्ते, मेरे पास एक ही मुद्दा है। लगातार 5 से अधिक बार आवेदन चलाने के बाद, मुझे प्राप्त स्मृति चेतावनी मिल रही है। 20 बार के लिए स्तर = 1, लेकिन आवेदन दुर्घटनाग्रस्त नहीं है। लेकिन जब मुझे यह संदेश मिलता है, प्राप्त स्मृति चेतावनी। स्तर = 2 मेरा एप्लिकेशन क्रैश हो रहा है। Level1 लगभग 20 बार प्रदर्शित होने के बाद Level2 दिखाई दे रहा है। मैं अपना एप्लिकेशन क्रैश कैसे कर सकता हूं। धन्यवाद
श्रीकांत रोंगाली

1
@ केनी: कम मेमोरी का मतलब है, हम अधिकतम कितना उपयोग कर सकते हैं। हमारे पास लाइव बाइट्स कितने हो सकते हैं। मेरे क्रैश लॉग में मुझे यह मिला। नि: शुल्क पेज: 371 वायर्ड पेज: 12192 दुर्गम पृष्ठ: 0 सबसे बड़ी प्रक्रिया: DTMobileIS इसका क्या मतलब है? मुझे कहाँ ध्यान रखना चाहिए? धन्यवाद।
श्रीकांत रोंगाली

9
@srik: आप बेहतर तरीके से एक नया सवाल पूछेंगे
kennytm

@kennytm: क्या यह अभी भी ios8 के साथ संभव है? मैंने देखा है कि फ़ंक्शन में परिभाषित किया गया है libsystem_c.dylib। यह बहुत अच्छा होगा अगर मैं आगे बढ़कर इसका इस्तेमाल कर सकूं। धन्यवाद
फॉक्स जूल 27'15

12

से OSMemoryNotification.h ,

/*
** Threshold values for notifications
*/

typedef enum {
    OSMemoryNotificationLevelAny      = -1,
    OSMemoryNotificationLevelNormal   =  0,
    OSMemoryNotificationLevelWarning  =  1,
    OSMemoryNotificationLevelUrgent   =  2,
    OSMemoryNotificationLevelCritical =  3
} OSMemoryNotificationLevel;

टोटल 5 लेवल ऑफ़ मेमोरी वार्निंग (-1,3)।

मेमोरी लेवल चेतावनी विवरण के संबंध में, @ केनीटीएम का उत्तर उत्कृष्ट है।

मैं कई संबंधित बिंदुओं को जोड़ना चाहता हूं जो पीएम और अन्य की मदद कर सकते हैं।


मेमोरी लेवल वार्निंग होने पर आपको क्या करना चाहिए?

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


मेमोरी लेवल चेतावनी कैसे देखें?

से http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html

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

UIKit निम्न-मेमोरी चेतावनी प्राप्त करने के कई तरीके प्रदान करता है, जिनमें निम्न शामिल हैं:

  • ApplicationDidReceiveMemoryWarning को लागू करें: आपके एप्लिकेशन प्रतिनिधि की विधि।
  • अपने कस्टम UIViewController उपवर्ग में didReceiveMemoryWarning विधि को ओवरराइड करें।
  • UIApplicationDidReceiveMemoryWarningNotificationnotification प्राप्त करने के लिए पंजीकरण करें।

अपने ऐप की मेमोरी फ़ुटप्रिंट को कैसे कम करें?

  • स्मृति लीक को हटा दें।
  • संसाधन फ़ाइलों को यथासंभव छोटा करें।
  • बड़े डेटा सेट के लिए कोर डेटा या SQLite का उपयोग करें।
  • संसाधनों को आलसी तरीके से लोड करें।
  • अंगूठा विकल्प का उपयोग करके अपना कार्यक्रम बनाएं।

पर विवरण http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html


मेमोरी को बुद्धिमानी से कैसे आवंटित करें?

  • ऑटोरेल्ड ऑब्जेक्ट्स के अपने उपयोग को कम करें : स्वचालित संदर्भ गिनती (एआरसी) के साथ, ऑब्जेक्ट्स को आवंटित / इनविट करने के लिए बेहतर है और संकलक को आपके लिए उपयुक्त समय पर जारी करने दें। यह अस्थायी वस्तुओं के लिए भी सच है कि अतीत में आपको वर्तमान पद्धति के दायरे से बाहर रहने से रोकने के लिए ऑटोरेलिज्ड हो सकता है।
  • संसाधनों पर आकार का आकार सीमित करें : जब कोई छोटा कार्य करेगा तो बड़ी संसाधन फ़ाइल को लोड करने से बचें। उच्च-रिज़ॉल्यूशन वाली छवि का उपयोग करने के बजाय, iOS-आधारित उपकरणों के लिए उचित आकार का उपयोग करें। यदि आपको बड़ी संसाधन फ़ाइलों का उपयोग करना चाहिए, तो उस फ़ाइल के केवल हिस्से को लोड करने के तरीके खोजें, जिनकी आपको किसी भी समय आवश्यकता है। उदाहरण के लिए, संपूर्ण फ़ाइल को मेमोरी में लोड करने के बजाय, फ़ाइल के कुछ हिस्सों को मेमोरी में मैप करने के लिए mmap और munmap फ़ंक्शन का उपयोग करें। स्मृति में फ़ाइलों के मानचित्रण के बारे में अधिक जानकारी के लिए।
  • अनबाउंड प्रॉब्लम सेट से बचें : अनबाउंड प्रॉब्लम सेट को गणना करने के लिए मनमाने ढंग से बड़ी मात्रा में डेटा की आवश्यकता हो सकती है। यदि सेट के लिए उपलब्ध अधिक मेमोरी की आवश्यकता होती है, तो आपका ऐप गणनाओं को पूरा करने में असमर्थ हो सकता है। आपके ऐप्स को जब भी संभव हो ऐसे सेट से बचना चाहिए और ज्ञात मेमोरी सीमा के साथ समस्याओं पर काम करना चाहिए।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.