हीप डंप कैप्चर करके, यह देखा जा सकता है कि कैप्चर करते समय आपके ऐप्लिकेशन में कौनसे ऑब्जेक्ट मेमोरी का इस्तेमाल कर रहे हैं. साथ ही, मेमोरी लीक या मेमोरी के बंटवारे से जुड़ी ऐसी समस्याओं का पता लगाया जा सकता है जिनकी वजह से ऐप्लिकेशन में रुक-रुक कर चलने, फ़्रीज़ होने या क्रैश होने की समस्या आ सकती है. उपयोगकर्ता के लंबे सेशन के बाद, हीप डंप कैप्चर करना खास तौर पर मददगार होता है. इससे, मेमोरी में मौजूद उन ऑब्जेक्ट के बारे में पता चल सकता है जो अब वहां नहीं होने चाहिए.
इस पेज पर, Android Studio में हीप डंप इकट्ठा करने और उनका विश्लेषण करने के लिए उपलब्ध टूल के बारे में बताया गया है. इसके अलावा,
कमांड लाइन से dumpsys की मदद से, अपने ऐप्लिकेशन की मेमोरी की जांच की जा सकती है. साथ ही,
Logcat में गार्बेज कलेक्शन (जीसी) इवेंट देखे जा सकते हैं.
आपको अपने ऐप्लिकेशन की मेमोरी की प्रोफ़ाइल क्यों बनानी चाहिए
Android, मैनेज की गई मेमोरी का एनवायरमेंटउपलब्ध कराता है. जब Android को पता चलता है कि आपका ऐप्लिकेशन अब कुछ ऑब्जेक्ट का इस्तेमाल नहीं कर रहा है, तो गार्बेज कलेक्टर, इस्तेमाल न की गई मेमोरी को हीप में वापस भेज देता है. Android, इस्तेमाल न की गई मेमोरी को ढूंढने के तरीके को लगातार बेहतर बना रहा है. हालांकि, Android के सभी वर्शन में, सिस्टम को कुछ समय के लिए आपके कोड को रोकना पड़ता है. ज़्यादातर मामलों में, ये पॉज़ नज़र नहीं आते. हालांकि, अगर आपका ऐप्लिकेशन, सिस्टम के मुकाबले ज़्यादा तेज़ी से मेमोरी का इस्तेमाल करता है, तो हो सकता है कि कलेक्टर को आपके ऐप्लिकेशन के लिए ज़रूरत के मुताबिक मेमोरी खाली करने में समय लगे. इस वजह से, आपका ऐप्लिकेशन कुछ समय के लिए रुक सकता है. ऐप्लिकेशन के रुकने की वजह से, फ़्रेम छूट सकते हैं और ऐप्लिकेशन की स्पीड कम हो सकती है.
अगर आपका ऐप्लिकेशन धीमे नहीं चलता है, तब भी अगर उसमें मेमोरी लीक होती है, तो वह बैकग्राउंड में होने पर भी मेमोरी को बनाए रख सकता है. इस वजह से, सिस्टम की बाकी मेमोरी की परफ़ॉर्मेंस धीमी हो सकती है, क्योंकि इससे गार्बेज कलेक्शन इवेंट बार-बार होते हैं. आखिर में, सिस्टम को मेमोरी वापस पाने के लिए, आपके ऐप्लिकेशन की प्रोसेस को बंद करना पड़ता है. इसके बाद, जब उपयोगकर्ता आपके ऐप्लिकेशन पर वापस आता है, तो ऐप्लिकेशन की प्रोसेस को पूरी तरह से रीस्टार्ट करना पड़ता है.
ऐसी प्रोग्रामिंग प्रैक्टिस के बारे में जानने के लिए जिनसे आपके ऐप्लिकेशन की मेमोरी का इस्तेमाल कम किया जा सकता है, अपने ऐप्लिकेशन की मेमोरी मैनेज करना लेख पढ़ें.
हीप डंप की खास जानकारी
हीप डंप कैप्चर करने के लिए, Analyze Memory Usage (Heap Dump) टास्क चुनें इसके लिए, Profiler: run 'app' as debuggable (complete data) का इस्तेमाल करें. हीप डंप कैप्चर करें. हीप डंप करते समय, Java मेमोरी की मात्रा अस्थायी तौर पर बढ़ सकती है. यह सामान्य है, क्योंकि हीप डंप, आपके ऐप्लिकेशन की प्रोसेस में ही होता है. साथ ही, डेटा इकट्ठा करने के लिए कुछ मेमोरी की ज़रूरत होती है. हीप डंप कैप्चर करने के बाद, आपको यह जानकारी दिखती है:
क्लास की सूची में यह जानकारी दिखती है:
- Allocations: हीप में मौजूद, मेमोरी के बंटवारे की संख्या.
नेटिव साइज़: इस ऑब्जेक्ट टाइप के लिए इस्तेमाल की गई, नेटिव मेमोरी की कुल मात्रा (बाइट में). आपको यहां Java में बांटे गए कुछ ऑब्जेक्ट के लिए मेमोरी दिखेगी, क्योंकि Android, फ़्रेमवर्क की कुछ क्लास के लिए नेटिव मेमोरी का इस्तेमाल करता है. जैसे,
Bitmap.Shallow Size: इस ऑब्जेक्ट टाइप के लिए इस्तेमाल की गई, Java मेमोरी की कुल मात्रा (बाइट में).
बनाए रखी गई मेमोरी का साइज़: इस क्लास के सभी इंस्टेंस की वजह से, बनाए रखी गई मेमोरी का कुल साइज़ (बाइट में).
कुछ हीप को फ़िल्टर करने के लिए, हीप मेन्यू का इस्तेमाल करें:
- App heap (default): यह वह मुख्य हीप है जिस पर आपका ऐप्लिकेशन मेमोरी का बंटवारा करता है.
- इमेज हीप: यह सिस्टम बूट इमेज है. इसमें ऐसी क्लास होती हैं जो बूट होने के दौरान पहले से लोड होती हैं . यहां बांटी गई मेमोरी कभी भी नहीं हटती या कहीं और नहीं जाती.
- 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 में, सामान्य फ़ील्ड और रेफ़रंस टाइप, स्ट्रक्चर्ड टाइप
,
ऐरे
,
और प्रिमिटिव डेटा टाइप
होते हैं. सोर्स कोड में, उससे जुड़े इंस्टेंस या लाइन पर जाने के लिए, किसी फ़ील्ड या रेफ़रंस पर राइट-क्लिक करें.
- फ़ील्ड: इस इंस्टेंस में मौजूद सभी फ़ील्ड दिखाता है.
- रेफ़रंस: इंस्टैंस टैब में हाइलाइट किए गए ऑब्जेक्ट के सभी रेफ़रंस दिखाता है.
डुप्लीकेट बिटमैप का पता लगाना
Android Studio Narwhal 4 से, हीप डंप व्यू में डुप्लीकेट बिटमैप का भी पता लगाया जा सकता है.
यहां उन्हें ढूंढने का तरीका बताया गया है:
- Android Studio में, Profiler टैब खोलें
- Heap Dump (या Analyze Memory Usage) पर क्लिक करें. इसके बाद, रिकॉर्ड करें पर क्लिक करके, अपने ऐप्लिकेशन की मौजूदा मेमोरी की स्थिति का स्नैपशॉट लें.
- विश्लेषण के नतीजों में, पीले रंग के चेतावनी वाले त्रिकोण ⚠️ को स्कैन करें. Android Studio, डुप्लीकेट बिटमैप को कई बार सेव किए जाने पर, उन्हें फ़्लैग करने के लिए इसका इस्तेमाल करता है.
- इसके अलावा, प्रफ़ाइलर हेडर पर जाएं, Filter by: चुनें, और Duplicate Bitmaps सेटिंग चुनें.
- फ़्लैग की गई किसी भी एंट्री पर क्लिक करके, Bitmap Preview पैन खोलें. इससे आपको यह पता चलता है कि कौनसी इमेज डुप्लीकेट है.
- उस विज़ुअल पुष्टि का इस्तेमाल करके, अपने कोड में डुप्लीकेट लोडिंग लॉजिक को ट्रैक करें और बेहतर कैशिंग रणनीति लागू करें.
मेमोरी लीक ढूंढना
मेमोरी लीक से जुड़ी क्लास को तेज़ी से फ़िल्टर करने के लिए, क्लास ड्रॉप-डाउन खोलें और Show activity/fragment leaks को चुनें. Android Studio
आपके ऐप्लिकेशन में
Activity और
Fragment इंस्टेंस के लिए, उन क्लास को दिखाता है जिनसे मेमोरी लीक होने की संभावना होती है.
मेमोरी लीक को मैन्युअल तरीके से ढूंढने के लिए, क्लास और इंस्टेंस की सूची ब्राउज़ करें. साथ ही, Retained Size वाले ऑब्जेक्ट ढूंढें. इन वजहों से होने वाले मेमोरी लीक ढूंढें:
ActivityयाContextके लंबे समय तक बने रहने वाले रेफ़रंस, जिनकी वजह से होस्ट किए गए Compose कंपोज़िशन ग्राफ़ (जैसे,ComposeViewऔर उसके सब-कंपोज़ेबल) लीक हो सकते हैं.- Jetpack Compose स्टेट ऑब्जेक्ट (
MutableState), स्टेट होल्डर या लैम्डा लीक करना, जोContextको कैप्चर करते हैं. -
DisposableEffectकेonDisposeब्लॉक में, लिसनर या ऑब्ज़र्वर को साफ़ करना भूल जाना. - नॉन-स्टैटिक इनर क्लास, जैसे कि a
Runnable, जो anActivityइंस्टेंस को होल्ड कर सकती है. - कैश, जो ज़रूरत से ज़्यादा समय तक ऑब्जेक्ट को होल्ड करते हैं.
मेमोरी लीक की संभावना का पता चलने पर, 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