हीप डंप कैप्चर करें

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

इस पेज पर, Android Studio में उपलब्ध उन टूल के बारे में बताया गया है जिनकी मदद से हीप डंप इकट्ठा और विश्लेषण किया जा सकता है. इसके अलावा, dumpsys की मदद से कमांड लाइन से अपने ऐप्लिकेशन की मेमोरी की जांच की जा सकती है. साथ ही, Logcat में गार्बेज कलेक्शन (जीसी) इवेंट देखे जा सकते हैं.

आपको अपने ऐप्लिकेशन की मेमोरी को प्रोफ़ाइल क्यों करना चाहिए

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

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

प्रोग्रामिंग के ऐसे तरीकों के बारे में जानने के लिए जिनसे आपके ऐप्लिकेशन की मेमोरी का इस्तेमाल कम हो सकता है, [अपने ऐप्लिकेशन की मेमोरी मैनेज करें]मेमोरी पढ़ें.

हीप डंप की खास जानकारी

हीप डंप कैप्चर करने के लिए, मेमोरी के इस्तेमाल का विश्लेषण करें (हीप डंप) टास्क चुनें. हीप डंप कैप्चर करने के लिए, प्रोफ़ाइलर: 'ऐप्लिकेशन' को डीबग करने लायक (पूरा डेटा) के तौर पर चलाएं का इस्तेमाल करें. हीप को डंप करते समय, कुछ समय के लिए Java मेमोरी बढ़ सकती है. ऐसा होना सामान्य है, क्योंकि हीप डंप उसी प्रोसेस में होता है जिसमें आपका ऐप्लिकेशन होता है. साथ ही, डेटा इकट्ठा करने के लिए कुछ मेमोरी की ज़रूरत होती है. हीप डंप कैप्चर करने के बाद, आपको यह जानकारी दिखेगी:

Android Studio प्रोफ़ाइलर में हीप डंप व्यू.

क्लास की सूची में यह जानकारी दिखती है:

  • एलोकेशन: हीप में एलोकेशन की संख्या.
  • नेटिव साइज़: इस ऑब्जेक्ट टाइप के लिए इस्तेमाल की गई नेटिव मेमोरी की कुल संख्या (बाइट में). आपको यहां Java में असाइन किए गए कुछ ऑब्जेक्ट के लिए मेमोरी दिखेगी. ऐसा इसलिए, क्योंकि Android कुछ फ़्रेमवर्क क्लास के लिए नेटिव मेमोरी का इस्तेमाल करता है, जैसे कि Bitmap.

  • शैलो साइज़: इस ऑब्जेक्ट टाइप के लिए इस्तेमाल की गई Java मेमोरी की कुल मात्रा (बाइट में).

  • रिटेन किया गया साइज़: इस क्लास के सभी इंस्टेंस की वजह से, रिटेन की गई मेमोरी का कुल साइज़ (बाइट में).

हीप मेन्यू का इस्तेमाल करके, कुछ हीप को फ़िल्टर करें:

  • ऐप्लिकेशन हीप (डिफ़ॉल्ट): यह मुख्य हीप होता है, जिसमें आपका ऐप्लिकेशन मेमोरी असाइन करता है.
  • इमेज हीप: सिस्टम बूट इमेज, जिसमें ऐसी क्लास होती हैं जो बूट के समय पहले से लोड होती हैं. यहां मौजूद ऐलोकेशन कभी नहीं हटते.
  • ज़ाइगोट हीप: कॉपी-ऑन-राइट हीप, जहां से Android सिस्टम में ऐप्लिकेशन प्रोसेस को फ़ोर्क किया जाता है.

एलोकेशन को व्यवस्थित करने का तरीका चुनने के लिए, ड्रॉप-डाउन मेन्यू का इस्तेमाल करें:

  • क्लास के हिसाब से व्यवस्थित करें (डिफ़ॉल्ट): क्लास के नाम के आधार पर, सभी असाइनमेंट को ग्रुप में बांटता है.
  • पैकेज के हिसाब से व्यवस्थित करें: पैकेज के नाम के आधार पर, सभी आवंटनों को ग्रुप में बांटता है.

क्लास के ग्रुप को फ़िल्टर करने के लिए, क्लास के ड्रॉप-डाउन का इस्तेमाल करें:

  • सभी क्लास (डिफ़ॉल्ट): इसमें सभी क्लास दिखती हैं. इनमें लाइब्रेरी और डिपेंडेंसी की क्लास भी शामिल हैं.
  • गतिविधि/फ़्रैगमेंट लीक दिखाएं: इससे वे क्लास दिखती हैं जिनकी वजह से मेमोरी लीक हो रही है.
  • प्रोजेक्ट की क्लास दिखाएं: इससे सिर्फ़ आपके प्रोजेक्ट की क्लास दिखती हैं.

इंस्टेंस पैनल खोलने के लिए, क्लास के नाम पर क्लिक करें. सूची में शामिल हर इंस्टेंस में ये चीज़ें शामिल होती हैं:

  • डेप्थ: किसी भी जीसी रूट से चुने गए इंस्टेंस तक पहुंचने के लिए, कम से कम कितने हॉप की ज़रूरत है.
  • नेटिव साइज़: नेटिव मेमोरी में इस इंस्टेंस का साइज़. यह कॉलम सिर्फ़ Android 7.0 और इसके बाद के वर्शन के लिए दिखता है.
  • शैलो साइज़: Java मेमोरी में इस इंस्टेंस का साइज़.
  • रिटेन किया गया साइज़: मेमोरी का वह साइज़ जिस पर इस इंस्टेंस का कंट्रोल होता है. यह डोमिनेटर ट्री के हिसाब से होता है.

किसी इंस्टेंस पर क्लिक करके, इंस्टेंस की जानकारी देखें. इसमें उसके फ़ील्ड और रेफ़रंस शामिल होते हैं. सामान्य फ़ील्ड और रेफ़रंस टाइप, Java में स्ट्रक्चर्ड टाइप , ऐरे , और प्रिमिटिव डेटा टाइप होते हैं. सोर्स कोड में, उससे जुड़े इंस्टेंस या लाइन पर जाने के लिए, किसी फ़ील्ड या रेफ़रंस पर राइट क्लिक करें.

  • Fields: इसमें इस इंस्टेंस के सभी फ़ील्ड दिखते हैं.
  • रेफ़रंस: इंस्टेंस टैब में हाइलाइट किए गए ऑब्जेक्ट के हर रेफ़रंस को दिखाता है.
हीप डंप टूल विंडो में इंस्टेंस, फ़ील्ड, और रेफ़रंस व्यू.

डुप्लीकेट बिटमैप का पता लगाना

Android Studio Narwhal 4 और इसके बाद के वर्शन में, हीप डंप व्यू में ग़ैर-ज़रूरी बिटमैप का भी पता लगाया जा सकता है.

उन्हें ढूंढने का तरीका यहां बताया गया है:

  1. Android Studio में प्रोफ़ाइलर टैब खोलें
  2. हीप डंप (या मेमोरी के इस्तेमाल का विश्लेषण करें) पर क्लिक करें. इसके बाद, अपने ऐप्लिकेशन की मौजूदा मेमोरी की स्थिति का स्नैपशॉट लेने के लिए, रिकॉर्ड पर क्लिक करें.
  3. विश्लेषण के नतीजों में, पीले रंग के चेतावनी वाले त्रिकोण ⚠️ को स्कैन करें. Android Studio इसका इस्तेमाल, डुप्लीकेट बिटमैप को कई बार सेव किए जाने की जानकारी देने के लिए करता है.
    • इसके अलावा, प्रोफ़ाइलर हेडर पर जाएं और इसके हिसाब से फ़िल्टर करें: को चुनें. इसके बाद, डुप्लीकेट बिट मैप सेटिंग चुनें.
  4. बिटमैप की झलक वाला पैनल खोलने के लिए, फ़्लैग की गई किसी भी एंट्री पर क्लिक करें. इससे आपको यह पता चल पाएगा कि कौनसी इमेज बार-बार उल्लंघन कर रही है.
  5. इस विज़ुअल कन्फ़र्मेशन का इस्तेमाल करके, अपने कोड में ग़ैर-ज़रूरी लोडिंग लॉजिक को ट्रैक करें और कैश मेमोरी में सेव करने की बेहतर रणनीति लागू करें.
डुप्लीकेट बिटमैप ढूंढने के लिए, पीले रंग के चेतावनी वाले त्रिकोण ⚠️ का इस्तेमाल करें.

मेमोरी लीक का पता लगाना

मेमोरी लीक से जुड़ी क्लास को तुरंत फ़िल्टर करने के लिए, क्लास ड्रॉप-डाउन खोलें और गतिविधि/फ़्रैगमेंट लीक दिखाएं को चुनें. Android Studio ऐसी क्लास दिखाता है जो आपके ऐप्लिकेशन में Activity और Fragment इंस्टेंस के लिए, मेमोरी लीक होने का संकेत देती हैं.

मेमोरी लीक को मैन्युअल तरीके से ढूंढने के लिए, क्लास और इंस्टेंस की सूचियां ब्राउज़ करें. इससे आपको बड़े रिटेन किए गए साइज़ वाले ऑब्जेक्ट ढूंढने में मदद मिलेगी. इनमें से किसी भी वजह से होने वाले मेमोरी लीक का पता लगाएं:

  • Activity या Context के लंबे समय तक रहने वाले रेफ़रंस, जो होस्ट किए गए Compose कंपोज़िशन ग्राफ़ को लीक कर सकते हैं. जैसे, ComposeView और इसके सब-कंपोज़ेबल.
  • Jetpack Compose के स्टेट ऑब्जेक्ट (MutableState), स्टेट होल्डर या Context को कैप्चर करने वाले लैम्ब्डा लीक हो रहे हैं.
  • DisposableEffect के onDispose ब्लॉक में, लिसनर या ऑब्ज़र्वर को क्लीन अप करना भूल जाना.
  • नॉन-स्टैटिक इनर क्लास, जैसे कि Runnable, जो Activity इंस्टेंस को होल्ड कर सकती हैं.
  • ऐसे कैश मेमोरी जो ऑब्जेक्ट को ज़रूरत से ज़्यादा समय तक सेव रखती हैं.

जब आपको संभावित मेमोरी लीक का पता चले, तो इंस्टेंस की जानकारी में मौजूद फ़ील्ड और रेफ़रंस टैब का इस्तेमाल करें. इससे, आपको उस इंस्टेंस या सोर्स कोड लाइन पर जाने में मदद मिलेगी जिसमें आपकी दिलचस्पी है.

जांच के लिए मेमोरी लीक ट्रिगर करना

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

इनमें से किसी एक तरीके से भी मेमोरी लीक को ट्रिगर किया जा सकता है:

  • अलग-अलग गतिविधि की स्थितियों में, डिवाइस को पोर्ट्रेट से लैंडस्केप और फिर से पोर्ट्रेट मोड में कई बार घुमाएं. डिवाइस को रोटेट करने पर, अक्सर ऐप्लिकेशन से Activity लीक हो सकता है. साथ ही, इससे होस्ट किया गया Compose यूज़र इंटरफ़ेस (यूआई) ट्री और उससे जुड़े स्टेट ट्री भी लीक हो सकते हैं. ऐसा तब होता है, जब आपका ऐप्लिकेशन एसिंक्रोनस ऑपरेशन या स्टेट होल्डर के अंदर Activity या Context का रेफ़रंस रखता है.
  • अलग-अलग गतिविधि की स्थितियों में, अपने ऐप्लिकेशन और किसी दूसरे ऐप्लिकेशन के बीच स्विच करना. उदाहरण के लिए, होम स्क्रीन पर जाएं और फिर अपने ऐप्लिकेशन पर वापस आएं.

हीप डंप रिकॉर्डिंग को एक्सपोर्ट और इंपोर्ट करना

प्रोफ़ाइलर में पिछली रिकॉर्डिंग टैब से, हीप डंप फ़ाइल को एक्सपोर्ट और इंपोर्ट किया जा सकता है. Android Studio, रिकॉर्डिंग को .hprof फ़ाइल के तौर पर सेव करता है.

इसके अलावा, jhat जैसे किसी दूसरे .hprof फ़ाइल ऐनलाइज़र का इस्तेमाल करने के लिए, आपको .hprof फ़ाइल को Android फ़ॉर्मैट से Java SE .hprof फ़ाइल फ़ॉर्मैट में बदलना होगा. फ़ाइल फ़ॉर्मैट को बदलने के लिए, {android_sdk}/platform-tools/ डायरेक्ट्री में दिए गए hprof-conv टूल का इस्तेमाल करें. hprof-conv कमांड को दो आर्ग्युमेंट के साथ चलाएं: ओरिजनल .hprof फ़ाइल का नाम और बदली गई .hprof फ़ाइल को सेव करने की जगह. इसमें नई .hprof फ़ाइल का नाम भी शामिल है. उदाहरण के लिए:

hprof-conv heap-original.hprof heap-converted.hprof

अन्य संसाधन