बिट मैप के लिए मेमोरी का इस्तेमाल

आम तौर पर, बिटमैप किसी ऐप्लिकेशन में सबसे ज़्यादा मेमोरी इस्तेमाल करने वाले ऑब्जेक्ट होते हैं. फ़्रेम रेंडर करने के लिए, डिकोड करने और स्केल करने की प्रोसेस अक्सर ज़रूरी होती है. बिटमैप मेमोरी के इस्तेमाल को ऑप्टिमाइज़ करने से, यूज़र इंटरफ़ेस (यूआई) की रिस्पॉन्सिवनेस, बैटरी लाइफ़, और स्थिरता में काफ़ी सुधार होता है. ऐसा इसलिए होता है, क्योंकि इससे जंक, एएनआर, और ओओएम से जुड़ी प्रोसेस किल कम हो जाती हैं.

ज़्यादा बिटमैप मेमोरी के इस्तेमाल की पहचान करना

Android की ज़रूरी जानकारी, Android डिवाइसों से डेटा इकट्ठा करके, किसी ऐप्लिकेशन के बिटमैप मेमोरी फ़ुटप्रिंट के बारे में मेट्रिक उपलब्ध कराती है. इन मेट्रिक में, हर पैकेज और प्रोसेस के लिए, अवधि के हिसाब से (उदाहरण के लिए, 28 दिन) पर्सेंटाइल शामिल होते हैं. इस डेटा से, अलग-अलग तरह के डिवाइसों और वर्शन में, मेमोरी की क्षमता से जुड़े रुझानों और संभावित रिग्रेशन की पहचान करने में मदद मिलती है.

Android की ज़रूरी जानकारी, आपके ऐप्लिकेशन के बिटमैप मेमोरी के इस्तेमाल की जानकारी शेयर करती है. इसे इन प्रोसेस स्थितियों के हिसाब से बांटा जाता है:

  • फ़ोरग्राउंड: ऐप्लिकेशन की प्रोसेस दिख रही है. उम्मीद की जाती है कि फ़ोरग्राउंड में P99, प्रोसेस की अन्य स्थितियों की तुलना में काफ़ी ज़्यादा होगा.हालांकि, अगर P99/P50 का अनुपात ज़्यादा है (उदाहरण के लिए, 3. 5 गुना से ज़्यादा), तो डेवलपर को इसकी जांच करनी चाहिए.ऐसा इसलिए, क्योंकि इससे अक्सर बिटमैप मेमोरी लीक होने का पता चलता है. इसकी पहचान करने के लिए, सामान्य इस्तेमाल (P50) और आउटलायर इस्तेमाल (P99) के बीच अंतर देखें. जहां सभी पर्सेंटाइल में ऐसेट ब्लोट की वजह से मेमोरी एक जैसी बढ़ती है, वहीं मेमोरी लीक की वजह से समय के साथ मेमोरी बढ़ती जाती है. इससे टेल-एंड डेटा (P99) में काफ़ी अंतर आ जाता है. पक्का करें कि ऐप्लिकेशन के अन्य स्थितियों में जाने के बाद, फ़ोरग्राउंड बिटमैप ऐलोकेशन, ज़रूरत से ज़्यादा समय तक न बने रहें.
  • उपयोगकर्ताओं को दिखने वाली सेवाएं: ऐप्लिकेशन की प्रोसेस, ऐसी स्थिति में चल रही है जो उपयोगकर्ताओं को दिखती है. इसमें फ़ोरग्राउंड सेवाएं, तेज़ी से काम करने वाली जॉब, और उपयोगकर्ता के अनुरोध पर शुरू होने वाली डेटा ट्रांसफ़र जॉब शामिल हैं. इन स्थितियों में जाने पर, ऐप्लिकेशन को फ़ोरग्राउंड बिटमैप ऐलोकेशन को बनाए नहीं रखना चाहिए. ऐसा इसलिए, क्योंकि इन सेवाओं को लंबे समय तक चलने वाले टास्क के लिए डिज़ाइन किया गया है. बड़ी ऐसेट को बनाए रखने से, उपयोगकर्ता अनुभव खराब होता है. साथ ही, लो मेमोरी किलर डेमॉन (एलएमकेडी) को कम प्राथमिकता वाली प्रोसेस को खत्म करके, मेमोरी वापस लेनी पड़ती है.
  • बैकग्राउंड: ऐप्लिकेशन, बैकग्राउंड में चलने वाली सेवा चला रहा है या हाल ही में बैकग्राउंड में गया है. हालांकि, यह अब तक कैश मेमोरी में सेव नहीं हुआ है. प्रोसेस की यह स्थिति, फ़ोरग्राउंड या उपयोगकर्ताओं को दिखने वाली प्रोसेस की तुलना में कम अहम होती है. इसलिए, ऐप्लिकेशन को यहां बड़े बिटमैप ऐसेट को साफ़ तौर पर रिलीज़ करना चाहिए, ताकि मेमोरी पर पड़ने वाले दबाव को कम किया जा सके.
  • कैश मेमोरी में सेव: ऐप्लिकेशन, कैश मेमोरी में सेव स्थिति में है. यह स्थिति, सिस्टम मेमोरी पर पड़ने वाले दबाव के हिसाब से बहुत संवेदनशील होती है. जैसे, एलएमके. इस स्थिति में, ऐप्लिकेशन को बिटमैप मेमोरी के इस्तेमाल को कम करना चाहिए, ताकि ओएस से उसे हटाया न जाए.

ज़्यादा बिटमैप मेमोरी के इस्तेमाल की वजहें

कैलकुलेशन में, कभी इस्तेमाल न की गई वर्चुअल मेमोरी भी शामिल की जा सकती है. अगर आपको बिटमैप मेमोरी का इस्तेमाल, उम्मीद से ज़्यादा दिखता है, तो पक्का करें कि आपने ऐसी मेमोरी ऐलोकेट न की हो जिसका इस्तेमाल न किया गया हो.

संसाधन

Android Studio में बिटमैप का विश्लेषण करना

बिटमैप के लिए Android Studio की प्रोफ़ाइलिंग

रीयल-टाइम में मेमोरी का बंटवारा की जांच करने, हीप डंप कैप्चर करने, और मेमोरी लीक के लिए ऑब्जेक्ट का विश्लेषण करने के लिए, मेमोरी प्रोफ़ाइलर का इस्तेमाल करें. इसके अलावा, मेमोरी लीक का पता लगाने, डुप्लीकेट बिट मैप ऐलोकेशन की पहचान करने, और ऑब्जेक्ट रिटेंशन को विज़ुअलाइज़ करने के लिए, हीप ऐनलाइज़र का इस्तेमाल करें.

LeakCanary की मदद से, मेमोरी लीक का अपने-आप पता लगाना

अपने ऐप्लिकेशन में मेमोरी लीक का अपने-आप पता लगाने के लिए, LeakCanary लाइब्रेरी को इंटिग्रेट करें. LeakCanary, हीप का अपने-आप विश्लेषण करता है. साथ ही, उन ऑब्जेक्ट की पहचान करता है जिन्हें गार्बेज कलेक्ट किया जाना चाहिए था, लेकिन वे अब भी मेमोरी में मौजूद हैं. जैसे, डिस्ट्रॉय की गई ऐक्टिविटी या फ़्रैगमेंट से बनाए गए बिटमैप.

बिटमैप परफ़ॉर्मेंस से जुड़ा दस्तावेज़

इन संसाधनों में, अलग-अलग Android कॉम्पोनेंट में बिटमैप को बेहतर तरीके से मैनेज करने के सबसे सही तरीकों के बारे में पूरी जानकारी दी गई है.

बिटमैप मेमोरी के इस्तेमाल को ऑप्टिमाइज़ करने के लिए, डेवलपर की चेकलिस्ट

बिटमैप मेमोरी की क्षमता को ऑप्टिमाइज़ करने के लिए, इन तीन मुख्य सिद्धांतों का पालन करें: कम करें, दोबारा इस्तेमाल करें, और रीसाइकल करें.

  • कम करें: बिटमैप लोड या दिखाने पर, शुरुआती मेमोरी फ़ुटप्रिंट को कम करें.
  • दोबारा इस्तेमाल करें: डुप्लीकेट बिटमैप ऐलोकेशन से बचने के लिए, कैश मेमोरी में सेव करने के तरीके लागू करें.
  • रीसाइकल करें: ऐक्टिव प्रोसेस के लिए मेमोरी को फिर से ऐलोकेट करने की अनुमति देने के लिए, संसाधनों को पहले से ही रिलीज़ करें.

डेवलपर की इस चेकलिस्ट की मदद से, बिटमैप मेमोरी के इस्तेमाल को ऑप्टिमाइज़ किया जा सकता है.

मुख्य सिद्धांत जगह ब्यौरा
कम करें डुप्लीकेट बिटमैप हटाएं डुप्लीकेट बिटमैप ऐलोकेशन का पता लगाने के लिए, मेमोरी प्रोफ़ाइलर का इस्तेमाल करके हीप डंप का विश्लेषण करें. मेमोरी प्रोफ़ाइलर का इस्तेमाल करके बिटमैप मेमोरी मैनेज करना गाइड देखें.
इमेज लोड करने वाली लाइब्रेरी का इस्तेमाल करें थ्रेडिंग, कैश मेमोरी में सेव करने, और बेहतर तरीके से डिकोड करने की प्रोसेस को अपने-आप करने के लिए, Glide और Coil जैसी लाइब्रेरी का इस्तेमाल करें.
डाउनसैंपलिंग लागू करें पूरी रिज़ॉल्यूशन वाली ऐसेट लोड करने के बजाय, टारगेट यूज़र इंटरफ़ेस (यूआई) कंटेनर के डाइमेंशन के हिसाब से इमेज डिकोड करें.
ओपेक इमेज के लिए RGB_565 का इस्तेमाल करें ट्रांसपेरेंसी के बिना वाली इमेज के लिए, 16-बिट कॉन्फ़िगरेशन पर ARGB_8888 स्विच करके, मेमोरी फ़ुटप्रिंट को 50% तक कम करें.
VectorDrawables को प्राथमिकता दें आइकॉन और बुनियादी ग्राफ़िक्स के लिए, वेक्टर का इस्तेमाल करें, ताकि कम मेमोरी ओवरहेड के साथ बेहतर तरीके से स्केल किया जा सके.
सर्वर साइड से इमेज की डिलीवरी ऑप्टिमाइज़ करना डिवाइस की डेंसिटी और ImageView के डाइमेंशन के हिसाब से इमेज दिखाने के लिए, बैकएंड एपीआई को कॉन्फ़िगर करें.
ट्रांसपेरेंट मार्जिन हटाएं इनसेटड्रॉएबल या लेआउट पैडिंग का इस्तेमाल करके, "न दिखने वाले" पिक्सल के लिए मेमोरी ऐलोकेट करने से बचें. इसके लिए, पहले से मौजूद मार्जिन का इस्तेमाल न करें. मेमोरी की परफ़ॉर्मेंस के हिसाब से Android ऐप्लिकेशन बनाना देखें.
दोबारा इस्तेमाल करें कैश मेमोरी के सही साइज़ कॉन्फ़िगर करें डिवाइस की रैम और स्क्रीन रिज़ॉल्यूशन के हिसाब से, मेमोरी और डिस्क की कैश मेमोरी की सीमाएं तय करें. बिटमैप को कैश मेमोरी में सेव करना देखें.
रीसाइकल करें बैकग्राउंड में मौजूद संसाधन हटाएं सिस्टम मेमोरी पर पड़ने वाले दबाव के दौरान, कैश मेमोरी को साफ़ करने और प्रोसेस को बेहतर बनाने के लिए, TRIM_MEMORY_BACKGROUND लागू करें.
यूज़र इंटरफ़ेस (यूआई) छिपा होने पर, ऐसेट रिलीज़ करें जब ऐप्लिकेशन, उपयोगकर्ता को न दिख रहा हो, तब बिटमैप कैश मेमोरी को रिलीज़ करने के लिए, TRIM_MEMORY_UI_HIDDEN का इस्तेमाल करें.
मेमोरी लीक पर नज़र रखें लाइफ़साइकलऑनर के डिस्ट्रॉय होने के बाद भी बने रहने वाले बिटमैप ढूंढने के लिए, LeakCanary और मेमोरी प्रोफ़ाइलर का इस्तेमाल करें. अपने ऐप्लिकेशन की मेमोरी मैनेज करना देखें.