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

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

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

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

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

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

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

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

हीप डंप कैप्चर करने के लिए, Analyze Memory Usage (Heap Dump) टास्क चुनें इसके लिए, Profiler: run 'app' as debuggable (complete data) का इस्तेमाल करें. हीप डंप कैप्चर करें. हीप डंप करते समय, Java की मेमोरी की मात्रा अस्थायी तौर पर बढ़ सकती है. यह सामान्य है, क्योंकि हीप डंप, आपके ऐप्लिकेशन की प्रोसेस में ही होता है. साथ ही, डेटा इकट्ठा करने के लिए कुछ मेमोरी की ज़रूरत होती है. हीप डंप कैप्चर करने के बाद, आपको यह जानकारी दिखती है:

Android Studio Profiler में हीप डंप व्यू.

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

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

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

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

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

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

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

  • Arrange by class (default): क्लास के नाम के आधार पर, सभी बंटवारे को ग्रुप में बांटता है.
  • Arrange by package: पैकेज के नाम के आधार पर, सभी बंटवारे को ग्रुप में बांटता है.

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

  • All classes (default): इसमें सभी क्लास दिखती हैं. इनमें लाइब्रेरी और डिपेंडेंसी की क्लास भी शामिल हैं .
  • Show activity/fragment leaks: इसमें वे क्लास दिखती हैं जिनकी वजह से मेमोरी लीक होती है.
  • Show project classes: इसमें सिर्फ़ आपके प्रोजेक्ट में तय की गई क्लास दिखती हैं.

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

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

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

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

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

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

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

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

मेमोरी लीक ढूंढना

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

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

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

मेमोरी लीक की संभावित समस्याओं का पता चलने पर, Instance Details में मौजूद Fields और References टैब का इस्तेमाल करके, इंस्टेंस या सोर्स कोड की लाइन पर जाएं.

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

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

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

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

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

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

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

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

अन्य संसाधन