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

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

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

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

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

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

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

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

संसाधन

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

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

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

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

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

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

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

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

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

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

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

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