हेप डंप कैप्चर करके देखें कि आपके ऐप्लिकेशन में कौनसे ऑब्जेक्ट, कैप्चर के समय मेमोरी का इस्तेमाल कर रहे हैं. साथ ही, मेमोरी लीक या मेमोरी के बंटवारे के उस व्यवहार की पहचान करें जिसकी वजह से ऐप्लिकेशन में रुकावट आती है, वह फ़्रीज़ हो जाता है, और यहां तक कि ऐप्लिकेशन क्रैश हो जाता है. इससे खास तौर पर, एक्सटेंडेड उपयोगकर्ता सेशन के बाद हीप डंप लेता है. इससे ऑब्जेक्ट तब भी दिखते हैं, जब में रह सकते हैं.
इस पेज पर, Android Studio में मौजूद उन टूल के बारे में बताया गया है जिनका इस्तेमाल करके, हेप डंप इकट्ठा किए जा सकते हैं और उनका विश्लेषण किया जा सकता है. इसके अलावा, dumpsys
की मदद से कमांड लाइन से अपने ऐप्लिकेशन की मेमोरी की जांच की जा सकती है. साथ ही, Logcat में गैर-ज़रूरी डेटा हटाने (GC) से जुड़े इवेंट देखे जा सकते हैं.
आपको ऐप्लिकेशन की मेमोरी का इस्तेमाल क्यों करना चाहिए
Android, मैनेज की गई मेमोरी का एक माहौल उपलब्ध कराता है. जब Android यह पता लगाता है कि आपका ऐप्लिकेशन अब कुछ ऑब्जेक्ट का इस्तेमाल नहीं कर रहा है, तो गै़रबेज कलेक्टर, इस्तेमाल नहीं की गई मेमोरी को ढेर में वापस छोड़ देता है. इस्तेमाल नहीं की गई मेमोरी को ढूंढने में Android कैसे मदद करता है जिसे लगातार बेहतर बनाया जा रहा है, लेकिन कभी-कभी सभी Android वर्शन पर, को कुछ समय के लिए आपके कोड को रोकना होगा. ज़्यादातर मामलों में, वीडियो रुकने की स्थिति नहीं होती. हालांकि, अगर आपका ऐप्लिकेशन, मेमोरी को जितनी तेज़ी से ऐलोकेट करता है उससे ज़्यादा तेज़ी से सिस्टम उसे इकट्ठा नहीं कर पाता, तो आपके ऐप्लिकेशन को कुछ समय लग सकता है. ऐसा तब होता है, जब कलेक्टर आपके ऐलोकेशन को पूरा करने के लिए ज़रूरत के मुताबिक मेमोरी खाली करता है. देरी की वजह से, आपके ऐप्लिकेशन में फ़्रेम स्किप हो सकते हैं और ऐप्लिकेशन के काम करने में ज़्यादा समय लग सकता है.
अगर आपका ऐप्लिकेशन धीमा नहीं चलता है, लेकिन उसमें मेमोरी लीक होती है, तो वह बैकग्राउंड में भी उस मेमोरी को बनाए रख सकता है. इस तरह के काम करने से बाकी रफ़्तार धीमी हो सकती है सिस्टम की मेमोरी की परफ़ॉर्मेंस पर इवेंट. आखिर में, सिस्टम को मेमोरी वापस पाने के लिए, आपके ऐप्लिकेशन की प्रोसेस को बंद करना पड़ता है. इसके बाद, जब उपयोगकर्ता आपके ऐप्लिकेशन पर वापस आता है, तो ऐप्लिकेशन की प्रोसेस रीस्टार्ट होनी चाहिए पूरी तरह से.
प्रोग्रामिंग के उन तरीकों के बारे में जानने के लिए जिनसे आपके ऐप्लिकेशन के लिए इस्तेमाल होने वाली मेमोरी कम हो सकती है, अपने ऐप्लिकेशन की मेमोरी मैनेज करना लेख पढ़ें.
हीप डंप की खास जानकारी
हीप डंप को कैप्चर करने के लिए, मेमोरी के इस्तेमाल का विश्लेषण करें (हीप डंप) टास्क चुनें हीप कैप्चर करने के लिए, (Profiler: 'app' को डीबग करने लायक (पूरा डेटा) के तौर पर चलाएं) डंप. हीप को डंप करते समय, Java मेमोरी की मात्रा बढ़ सकती है कुछ समय के लिए. यह सामान्य है, क्योंकि हीप डंप उसी प्रोसेस में होता है जिसमें आपका ऐप्लिकेशन चलता है. साथ ही, डेटा इकट्ठा करने के लिए, कुछ मेमोरी की ज़रूरत होती है. हेप डंप कैप्चर करने के बाद, आपको ये चीज़ें दिखेंगी:
क्लास की सूची में यह जानकारी दिखती है:
- ऐलोकेशन: ढेर में ऐलोकेशन की संख्या.
नेटिव साइज़: इस ऑब्जेक्ट टाइप के लिए इस्तेमाल की गई नेटिव मेमोरी की कुल संख्या ( बाइट). आपको यहां Java में ऐलोकेट किए गए कुछ ऑब्जेक्ट के लिए मेमोरी दिखेगी, क्योंकि Android कुछ फ़्रेमवर्क क्लास के लिए नेटिव मेमोरी का इस्तेमाल करता है. जैसे,
Bitmap
.शैलो साइज़: इस ऑब्जेक्ट टाइप के लिए इस्तेमाल की गई कुल Java मेमोरी (बाइट में).
बनाए गए साइज़: इस मेट्रिक से पता चलता है कि सभी इंस्टेंस की वजह से, सेव की गई मेमोरी का कुल साइज़ इस श्रेणी (बाइट में).
कुछ खास हीप मेन्यू को फ़िल्टर करने के लिए हीप मेन्यू का इस्तेमाल करें:
- ऐप्लिकेशन हीप (डिफ़ॉल्ट): वह मुख्य हीप, जिस पर आपका ऐप्लिकेशन मेमोरी असाइन करता है.
- इमेज हीप: सिस्टम बूट इमेज, जिसमें पहले से लोड की गई क्लास शामिल होती हैं बूट टाइम के दौरान. यहां मौजूद ऐलोकेशन कभी नहीं बदलते या हटते नहीं.
- Zygote ढेर: लिखते समय कॉपी होने वाला ढेर, जहां Android सिस्टम में किसी ऐप्लिकेशन प्रोसेस को फ़ॉर्क किया जाता है.
ऐलोकेशन को व्यवस्थित करने का तरीका चुनने के लिए, 'व्यवस्था' ड्रॉप-डाउन का इस्तेमाल करें:
- क्लास के हिसाब से व्यवस्थित करें (डिफ़ॉल्ट): क्लास के नाम के आधार पर सभी ऐलोकेशन को ग्रुप करता है.
- पैकेज के हिसाब से व्यवस्थित करें: यह पैकेज के नाम के आधार पर, असाइन किए गए सभी बजट को ग्रुप में बांटता है.
कक्षाओं के ग्रुप को फ़िल्टर करने के लिए, कक्षा ड्रॉप-डाउन का इस्तेमाल करें:
- सभी क्लास (डिफ़ॉल्ट): इसमें सभी क्लास दिखती हैं. इनमें लाइब्रेरी और डिपेंडेंसी से जुड़ी क्लास भी शामिल हैं.
- गतिविधि/फ़्रैगमेंट लीक दिखाएं: यह उन क्लास को दिखाता है जिनकी वजह से मेमोरी लीक हो रही है.
- प्रोजेक्ट क्लास दिखाएं: इसमें सिर्फ़ आपके प्रोजेक्ट की ओर से तय की गई क्लास दिखती हैं.
इंस्टेंस पैनल खोलने के लिए, किसी क्लास के नाम पर क्लिक करें. सूची में दिए गए हर इंस्टेंस में ये शामिल हैं निम्न:
- गहराई: किसी भी जीसी रूट से चुने गए तक हॉप की सबसे कम संख्या इंस्टेंस.
- नेटिव साइज़: नेटिव मेमोरी में इस इंस्टेंस का साइज़. यह कॉलम है सिर्फ़ Android 7.0 और उसके बाद वाले वर्शन के लिए दिखता है.
- शैल साइज़: Java मेमोरी में इस इंस्टेंस का साइज़.
- रिटेंन किया गया साइज़: डोमिनेट करने वाले ट्री के मुताबिक, इस इंस्टेंस के पास मौजूद मेमोरी का साइज़.
इंस्टेंस की जानकारी देखने के लिए, किसी इंस्टेंस पर क्लिक करें. इसमें उसके फ़ील्ड और रेफ़रंस शामिल हैं. Java में, सामान्य फ़ील्ड और रेफ़रंस टाइप में स्ट्रक्चर्ड टाइप, पंक्तियां
, और प्राइमटिव डेटा टाइप
शामिल हैं. सोर्स कोड में मौजूद किसी फ़ील्ड या रेफ़रंस से जुड़े इंस्टेंस या लाइन पर जाने के लिए, उस फ़ील्ड या रेफ़रंस पर दायां क्लिक करें.
- फ़ील्ड: इस कॉलम में सभी फ़ील्ड दिखते हैं.
- रेफ़रंस: इंस्टेंस टैब में हाइलाइट किए गए ऑब्जेक्ट का हर रेफ़रंस दिखाता है.
मेमोरी लीक होने की जानकारी ढूंढना
मेमोरी लीक से जुड़ी क्लास को तुरंत फ़िल्टर करने के लिए, खोलें
क्लास ड्रॉप-डाउन पर क्लिक करें और गतिविधि/फ़्रैगमेंट लीक दिखाएं चुनें. Android Studio, ऐसी क्लास दिखाता है जिनके बारे में उसे लगता है कि वे आपके ऐप्लिकेशन में Activity
और Fragment
इंस्टेंस के लिए, मेमोरी लीक का संकेत देती हैं. फ़िल्टर में दिखने वाले डेटा के टाइप में ये शामिल हैं:
Activity
के ऐसे इंस्टेंस जिन्हें मिटा दिया गया है, लेकिन अब भी उनका रेफ़रंस दिया जा रहा है.Fragment
ऐसे इंस्टेंस जिनमें मान्यFragmentManager
नहीं है, लेकिन फिर भी उनका रेफ़रंस दिया जा रहा है.
ध्यान रखें कि फ़िल्टर की वजह से, यहां दिए गए नतीजों में फ़ॉल्स पॉज़िटिव नतीजे मिल सकते हैं स्थितियां:
Fragment
बनाया गया है, लेकिन इसका इस्तेमाल अब तक नहीं किया गया है.Fragment
को कैश मेमोरी में सेव किया जा रहा है, लेकिनFragmentTransaction
के हिस्से के तौर पर नहीं.
मैन्युअल तरीके से मेमोरी लीक का पता लगाने के लिए, क्लास और इंस्टेंस की सूचियों को ब्राउज़ करें. इससे आपको ऐसे ऑब्जेक्ट मिलेंगे जिनका रिटेंन किया गया साइज़ ज़्यादा है. इनमें से किसी वजह से होने वाली मेमोरी लीक का पता लगाएं:
Activity
,Context
,View
,Drawable
, और अन्य ऑब्जेक्ट के लंबे समय तक मौजूद रहने वाले रेफ़रंस, जिनमेंActivity
याContext
कंटेनर का रेफ़रंस हो सकता है.- नॉन-स्टैटिक इनर क्लास, जैसे कि
Runnable
, इसमेंActivity
को होल्ड किया जा सकता है इंस्टेंस. - ऐसे कैश मेमोरी जो ज़रूरत से ज़्यादा समय तक ऑब्जेक्ट सेव रखते हैं.
जब आपको संभावित मेमोरी लीक होने का पता चले, तो फ़ील्ड और रेफ़रंस टैब का इस्तेमाल करें अपनी पसंद के इंस्टेंस या सोर्स कोड लाइन पर जाने के लिए, इंस्टेंस की जानकारी में जाएं.
जांच के लिए मेमोरी लीक को ट्रिगर करना
मेमोरी के इस्तेमाल का विश्लेषण करने के लिए, आपको अपने ऐप्लिकेशन के कोड पर ज़ोर देना चाहिए और मेमोरी को ज़बरदस्ती इस्तेमाल करने की कोशिश करनी चाहिए लीक हो जाता है. अपने ऐप्लिकेशन में मेमोरी लीक का पता लगाने का एक तरीका यह है कि हेप की जांच करने से पहले, उसे कुछ समय तक चलाएं. लीक, हेप में मौजूद ऐलोकेशन के सबसे ऊपर तक पहुंच सकती हैं. हालांकि, लीक जितनी छोटी होगी, उसे देखने के लिए आपको ऐप्लिकेशन को उतना ही ज़्यादा समय तक चलाना होगा.
इनमें से किसी एक तरीके से भी मेमोरी लीक को ट्रिगर किया जा सकता है:
- डिवाइस को पोर्ट्रेट से लैंडस्केप मोड में घुमाएं. इसके बाद, डिवाइस को कई बार पीछे की ओर घुमाएं
जब उपयोगकर्ता गतिविधि की अलग-अलग स्थितियों में हो. डिवाइस को घुमाने पर, अक्सर ऐप्लिकेशन से
Activity
,Context
याView
ऑब्जेक्ट लीक हो सकता है. ऐसा इसलिए होता है, क्योंकि सिस्टमActivity
को फिर से बनाता है. अगर आपके ऐप्लिकेशन में उनमें से किसी ऑब्जेक्ट का रेफ़रंस कहीं और मौजूद है, तो सिस्टम उसे ग़ैर-ज़रूरी डेटा के तौर पर हटा नहीं सकता. - अलग-अलग ऐक्टिविटी स्टेटस के दौरान, अपने ऐप्लिकेशन और किसी दूसरे ऐप्लिकेशन के बीच स्विच करना. उदाहरण के लिए, होम स्क्रीन पर जाएं और फिर अपने ऐप्लिकेशन पर वापस जाएं.
हीप डंप की रिकॉर्डिंग को एक्सपोर्ट और इंपोर्ट करना
प्रोफ़ाइलर में पिछली रिकॉर्डिंग टैब से, हेप डंप फ़ाइल को एक्सपोर्ट और इंपोर्ट किया जा सकता है. Android Studio,
.hprof
फ़ाइल के रूप में रिकॉर्ड कर रहा है.
इसके अलावा, किसी दूसरे .hprof
फ़ाइल ऐनालाइज़र का इस्तेमाल करने के लिए, जैसे कि
झाट,
आपको .hprof
फ़ाइल को Android फ़ॉर्मैट से Java SE में बदलना होगा
.hprof
फ़ाइल फ़ॉर्मैट. फ़ाइल फ़ॉर्मैट को बदलने के लिए, hprof-conv
टूल का इस्तेमाल करें
{android_sdk}/platform-tools/
डायरेक्ट्री में उपलब्ध कराया गया. hprof-conv
चलाएं
दो आर्ग्युमेंट के साथ निर्देश: मूल .hprof
फ़ाइल नाम और सेव की गई जगह
नई .hprof
फ़ाइल के साथ बदली गई .hprof
फ़ाइल लिखो. उदाहरण के लिए:
hprof-conv heap-original.hprof heap-converted.hprof