मेमोरी प्रोफ़ाइलर की मदद से अपने ऐप्लिकेशन के मेमोरी इस्तेमाल की जांच करें

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

मेमोरी प्रोफ़ाइलर खोलने के लिए, यह तरीका अपनाएं:

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

इसके अलावा, कमांड लाइन से ऐप्लिकेशन की मेमोरी की जांच करने के लिए, dumpsys को और logcat में जीसी इवेंट देखें.

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

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

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

इन समस्याओं से बचने के लिए, मेमोरी प्रोफ़ाइलर का इस्तेमाल करके फ़ॉलो किया जा रहा है:

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

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

मेमोरी प्रोफ़ाइलर की खास जानकारी

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

पहला डायग्राम. मेमोरी प्रोफ़ाइलर

जैसा कि पहली इमेज में दिखाया गया है, मेमोरी प्रोफ़ाइलर के डिफ़ॉल्ट व्यू में फ़ॉलो किया जा रहा है:

  1. गार्बेज कलेक्शन इवेंट लागू करने के लिए बटन.
  2. हीप डंप को कैप्चर करने का बटन.

    नोट: मेमोरी रिकॉर्ड करने के लिए एक बटन ऐलोकेशन हीप डंप बटन की दाईं ओर तब दिखता है, जब Android 7.1 (एपीआई लेवल 25) या इससे पहले के वर्शन वाले डिवाइस से कनेक्ट हो.

  3. यह तय करने के लिए ड्रॉपडाउन मेन्यू कि प्रोफ़ाइलर, मेमोरी को कितनी बार कैप्चर करता है आवंटन सही विकल्प चुनने से आपको मदद मिल सकती है प्रोफ़ाइल बनाते समय ऐप्लिकेशन की परफ़ॉर्मेंस को बेहतर बनाएं.
  4. टाइमलाइन में ज़ूम इन/आउट करने के बटन.
  5. लाइव मेमोरी डेटा पर जाने के लिए बटन.
  6. इवेंट की टाइमलाइन, जिसमें गतिविधि की स्थितियां, उपयोगकर्ता के इनपुट इवेंट, और स्क्रीन रोटेशन इवेंट.
  7. मेमोरी के इस्तेमाल की टाइमलाइन, जिसमें ये शामिल हैं:
    • हर मेमोरी कैटगरी के लिए, इस्तेमाल की जा रही मेमोरी का स्टैक किया गया ग्राफ़, जैसा कि बाईं ओर y-ऐक्सिस और कलर बटन से दिखाया गया है क्लिक करें.
    • डैश वाली लाइन, तय किए गए ऑब्जेक्ट की संख्या दिखाती है, जैसा कि यहां दिखाया गया है दाईं ओर y-ऐक्सिस से दबाएं.
    • कचरा इकट्ठा करने के हर इवेंट के लिए आइकॉन.

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

  • इवेंट की टाइमलाइन
  • असाइन किए गए ऑब्जेक्ट की संख्या
  • कचरा इकट्ठा करने के इवेंट

Android 8.0 और उसके बाद के वर्शन पर, डीबग करने के लिए, बेहतर प्रोफ़ाइलिंग की सुविधा हमेशा चालू रहती है दिखाई देता है.

मेमोरी की गिनती करने का तरीका

मेमोरी प्रोफ़ाइलर के शीर्ष पर आपको दिखाई देने वाली संख्याएं (इमेज 2), इन पर आधारित होती हैं निजता नीति के अनुसार, आपके ऐप्लिकेशन के ज़रिए किए गए सभी निजी मेमोरी पेज Android सिस्टम. इस संख्या में सिस्टम के साथ शेयर किए गए पेज शामिल नहीं हैं या अन्य ऐप्लिकेशन.

दूसरा डायग्राम. सबसे ऊपर 'यादें' काउंट लेजेंड का इस्तेमाल किया जा सकता है

मेमोरी की संख्या की कैटगरी इस तरह हैं:

  • Java: Java या Kotlin कोड से असाइन किए गए ऑब्जेक्ट की मेमोरी.
  • नेटिव: C या C++ कोड से असाइन किए गए ऑब्जेक्ट की मेमोरी.

    भले ही आप अपने ऐप्लिकेशन में C++ का उपयोग नहीं कर रहे हैं, तब भी आपको कुछ नेटिव मेमोरी दिखाई दे सकती है का इस्तेमाल यहां किया गया है, क्योंकि Android फ़्रेमवर्क, हैंडल के लिए नेटिव मेमोरी का इस्तेमाल करता है आपकी ओर से किए जाने वाले अलग-अलग टास्क, जैसे कि इमेज ऐसेट और अन्य ग्राफ़िक्स—भले ही आपने जो कोड लिखा है वह Java या Kotlin में हो.

  • ग्राफ़िक: वह मेमोरी जिसका इस्तेमाल ग्राफ़िक बफ़र सूची में पिक्सल दिखाने के लिए किया जाता है स्क्रीन, जिसमें GL सतह, GL टेक्स्चर वगैरह शामिल हैं. (ध्यान दें कि वह मेमोरी होती है जिसे सीपीयू के साथ शेयर किया जाता है, न कि जीपीयू के साथ.)

  • स्टैक: वह मेमोरी जिसका इस्तेमाल आपके ऐप्लिकेशन में नेटिव और Java स्टैक, दोनों तरह के लोगों के लिए किया जाता है. यह आम तौर पर, इस बात से जुड़ा होता है कि आपका ऐप्लिकेशन कितने थ्रेड पर चल रहा है.

  • कोड: वह मेमोरी जिसका इस्तेमाल आपका ऐप्लिकेशन, कोड और संसाधनों, जैसे कि dex के लिए करता है बाइटकोड, ऑप्टिमाइज़ या कंपाइल किया गया डेक्स कोड, .so लाइब्रेरी, और फ़ॉन्ट.

  • अन्य: वह मेमोरी जिसका इस्तेमाल ऐप्लिकेशन करता है, लेकिन सिस्टम को कैटगरी में बांटें.

  • तय किया गया: आपके ऐप्लिकेशन में तय किए गए Java/Kotlin ऑब्जेक्ट की संख्या. यह C या C++ में असाइन किए गए ऑब्जेक्ट की गिनती नहीं करता है.

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

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

असाइन की गई मेमोरी देखें

मेमोरी आवंटन दिखाती है कि हर Java ऑब्जेक्ट और JNI संदर्भ को आप मेमोरी बांट दी गई थी. खास तौर पर, मेमोरी प्रोफ़ाइलर आपको ऑब्जेक्ट ऐलोकेशन के बारे में नीचे दी गई जानकारी देखें:

  • किस तरह के ऑब्जेक्ट असाइन किए गए हैं और वे कितनी जगह का इस्तेमाल करते हैं.
  • हर ऐलोकेशन का स्टैक ट्रेस, जिसमें वह थ्रेड भी शामिल है.
  • जब ऑब्जेक्ट हटा दिए गए थे (सिर्फ़ Android 8.0 वाले डिवाइस का इस्तेमाल करते समय) या ज़्यादा).

Java और Kotlin के ऐलोकेशन को रिकॉर्ड करने के लिए, Java / Kotlin में हुए आवंटन को रिकॉर्ड करना, इसके बाद, रिकॉर्ड करें चुनें. अगर डिवाइस में Android 8 या इसके बाद का वर्शन है, तो मेमोरी प्रोफ़ाइलर का यूज़र इंटरफ़ेस (यूआई), एक अलग स्क्रीन पर ट्रांसफ़र हो जाता है. इस पर, रिकॉर्डिंग शामिल है. रिकॉर्डिंग के ऊपर मौजूद मिनी टाइमलाइन से इंटरैक्ट किया जा सकता है (उदाहरण के लिए, चुनी गई रेंज बदलने के लिए). रिकॉर्डिंग पूरी करने के लिए, बंद करें चुनें.

मेमोरी प्रोफ़ाइलर में Java के ऐलोकेशन का विज़ुअलाइज़ेशन

Android 7.1 और इससे पहले के वर्शन पर, मेमोरी प्रोफ़ाइलर लेगसी ऐलोकेशन का इस्तेमाल करता है रिकॉर्डिंग, जिसमें टाइमलाइन पर रिकॉर्डिंग तब तक दिखती है, जब तक आप उस पर क्लिक नहीं करते बंद करें.

टाइमलाइन का क्षेत्र चुनने के बाद (या रिकॉर्डिंग खत्म होने के बाद) सेशन के दौरान, Android 7.1 या इससे पहले के वर्शन वाले डिवाइस पर ऑब्जेक्ट दिखते हैं. उन्हें क्लास के नाम के हिसाब से ग्रुप किया जाता है और उनके क्रम के हिसाब से क्रम में लगाया जाता है हीप की संख्या.

असाइन किए गए डेटा की जांच करने के लिए, यह तरीका अपनाएं:

  1. सूची को ब्राउज़ करके उन ऑब्जेक्ट को ढूंढें जिनमें असामान्य रूप से काफ़ी ज़्यादा हीप हों और जो शायद लीक हो गए हों. जानी-पहचानी क्लास को ढूंढने में मदद करने के लिए, क्लास का नाम पर क्लिक करें अंग्रेज़ी वर्णमाला के क्रम में लगाने के लिए, कॉलम हेडर. इसके बाद, क्लास के नाम पर क्लिक करें. कॉन्टेंट बनाने इंस्टेंस व्यू पैनल, दाईं ओर दिखता है और हर इंस्टेंस को दिखाता है जैसा कि दूसरी इमेज में दिखाया गया है.
    • इसके अलावा, फ़िल्टर पर क्लिक करके, ऑब्जेक्ट का तेज़ी से पता लगाया जा सकता है , या Control+F (Mac पर Command+F) को दबाकर और कोई क्लास या पैकेज डालकर नाम डालें. नतीजों को खोजने के लिए, तरीके के नाम का इस्तेमाल करें ड्रॉपडाउन मेन्यू से, कॉलस्टैक के हिसाब से व्यवस्थित करें. अगर आपको सामान्य एक्सप्रेशन के हिसाब से, Regex के बगल में मौजूद बॉक्स को चुनें. इसके आगे स्थित बॉक्स को चेक करें अगर आपकी खोज क्वेरी केस-सेंसिटिव (बड़े और छोटे अक्षरों में अंतर) है, तो केस मैच करें.
  2. इंस्टेंस व्यू पैनल में, किसी इंस्टेंस पर क्लिक करें. कॉल स्टैक टैब नीचे दिया गया है. इससे पता चलता है कि यह इंस्टेंस कहां और किस थ्रेड में असाइन किया गया था.
  3. कॉल स्टैक टैब में, किसी भी लाइन पर राइट-क्लिक करें और एडिटर में उस कोड को खोलने के लिए, सीधे सोर्स पर जाएं.

तीसरी इमेज. असाइन किए गए हर ऑब्जेक्ट के बारे में जानकारी दाईं ओर इंस्टेंस व्यू में दिखते हैं

तय किए गए ऑब्जेक्ट की सूची के ऊपर दिए गए दो मेन्यू का इस्तेमाल करके, यह चुना जा सकता है कि और डेटा को व्यवस्थित करने के तरीके के बारे में बताएँ.

बाईं ओर दिए गए मेन्यू से, चुनें कि किस हीप की जांच करनी है:

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

दाईं ओर मौजूद मेन्यू से, बजट असाइन करने का तरीका चुनें:

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

प्रोफ़ाइल बनाते समय ऐप्लिकेशन की परफ़ॉर्मेंस बेहतर बनाएं

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

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

वैश्विक JNI संदर्भ देखें

Java नेटिव इंटरफ़ेस (जेएनआई) एक ऐसा फ़्रेमवर्क है जो Java कोड और नेटिव एक-दूसरे को कॉल करने के लिए कोड.

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

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

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

चौथी इमेज. वैश्विक JNI संदर्भ देखना

अपने ऐप्लिकेशन के जेएनआई कोड के लिए मेमोरी के बंटवारे की जांच करने के लिए, आपको उसे डिप्लॉय करना होगा Android 8.0 या इसके बाद के वर्शन वाले डिवाइस पर.

जेएनआई के बारे में ज़्यादा जानकारी के लिए, जेएनआई से जुड़ी सलाह देखें.

नेटिव मेमोरी प्रोफ़ाइलर

Android Studio के मेमोरी प्रोफ़ाइलर में, ऐप्लिकेशन के लिए एक नेटिव मेमोरी प्रोफ़ाइलर शामिल होता है Android 10 और इसके बाद के वर्शन पर चलने वाले फ़िज़िकल और वर्चुअल डिवाइसों पर डिप्लॉय किया जा सकता है.

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

  • ऐलोकेशन: malloc() या new के ज़रिए असाइन किए गए ऑब्जेक्ट की संख्या ऑपरेटर का इस्तेमाल करें.
  • डीलोकेशन: free() या चुनी गई समयावधि के दौरान delete ऑपरेटर.
  • ऐलोकेशन का साइज़: इस दौरान किए गए सभी आवंटन का एग्रीगेट किया गया साइज़, बाइट में दिखाई देती है.
  • डील की जगह का साइज़: खाली की गई सभी मेमोरी का कुल साइज़, बाइट में पर क्लिक करें.
  • कुल संख्या: आवंटन कॉलम के मान से Deallocations कॉलम में देखें.
  • बचा हुआ आकार: आवरण आकार कॉलम के मान में से डील की जगहों का साइज़ कॉलम में वैल्यू.

नेटिव मेमोरी प्रोफ़ाइलर

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

नेटिव ऐलोकेशन रिकॉर्ड करने का बटन

Android 9 और उससे पहले के वर्शन पर, नेटिव ऐलोकेशन को रिकॉर्ड करें विकल्प उपलब्ध हैं.

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

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

  1. Run > कॉन्फ़िगरेशन में बदलाव करना.
  2. बाएं पैनल में अपना ऐप्लिकेशन मॉड्यूल चुनें.
  3. प्रोफ़ाइलिंग टैब पर क्लिक करें और लेबल किए गए फ़ील्ड में सैंपल साइज़ डालें नेटिव मेमोरी सैंपलिंग इंटरवल (बाइट).
  4. अपना ऐप्लिकेशन फिर से बनाएं और चलाएं.

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

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

हीप डंप को कैप्चर करने के बाद, आपको यह जानकारी दिखेगी:

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

हीप डंप को कैप्चर करने के लिए, हीप डंप को कैप्चर करें पर क्लिक करें. इसके बाद, रिकॉर्ड करें चुनें. हीप को डंप करते समय, Java मेमोरी की मात्रा अस्थायी रूप से बढ़ सकती है. यह सामान्य बात है, क्योंकि हीप डंप उसी प्रोसेस में होता है जिसमें आपका ऐप्लिकेशन होता है और डेटा इकट्ठा करने के लिए मेमोरी की ज़रूरत होती है.

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

पांचवी इमेज. हीप डंप को देखा जा रहा है.

अगर आपको इस बारे में ज़्यादा सटीक जानकारी चाहिए कि डंप कब बनाया जाए, तो कॉल करके, अपने ऐप्लिकेशन कोड में अहम पॉइंट पर हीप डंप बनाया जा सकता है dumpHprofData().

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

  • ऐलोकेशन: हीप में ऐलोकेशन की संख्या.
  • नेटिव साइज़: इस ऑब्जेक्ट टाइप में इस्तेमाल की गई नेटिव मेमोरी की कुल संख्या (बाइट में). यह कॉलम सिर्फ़ Android 7.0 और उसके बाद के वर्शन में दिखता है.

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

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

  • बनाए रखा गया साइज़: इस मेट्रिक से पता चलता है कि सभी इंस्टेंस की वजह से, सेव की गई मेमोरी का कुल साइज़ इस श्रेणी की तुलना करें (बाइट में).

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

बाईं ओर दिए गए मेन्यू से, चुनें कि किस हीप की जांच करनी है:

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

दाईं ओर मौजूद मेन्यू से, बजट असाइन करने का तरीका चुनें:

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

सूची को डिफ़ॉल्ट रूप से बनाए गए साइज़ कॉलम के हिसाब से क्रम में लगाया जाता है. इसके अनुसार क्रम में लगाने के लिए में वैल्यू डालें, तो कॉलम की हेडिंग पर क्लिक करें.

दाईं ओर मौजूद इंस्टेंस व्यू विंडो खोलने के लिए, किसी क्लास के नाम पर क्लिक करें (छठी इमेज में दिखाया गया है). सूची में शामिल हर इंस्टेंस में ये शामिल हैं:

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

छठी इमेज. हीप को कैप्चर करने के लिए ज़रूरी अवधि डंप को टाइमलाइन में दिखाया गया है

हीप की जांच करने के लिए, यह तरीका अपनाएं:

  1. सूची को ब्राउज़ करके उन ऑब्जेक्ट को ढूंढें जिनमें असामान्य रूप से काफ़ी ज़्यादा हीप हों और जो शायद लीक हो गए हों. पहले से मालूम क्लास को ढूंढने के लिए, क्लास का नाम पर क्लिक करें अंग्रेज़ी वर्णमाला के क्रम में लगाने के लिए, कॉलम हेडर. इसके बाद, क्लास के नाम पर क्लिक करें. कॉन्टेंट बनाने इंस्टेंस व्यू पैनल, दाईं ओर दिखता है और हर इंस्टेंस को दिखाता है जैसा कि इमेज 6 में दिखाया गया है.
    • इसके अलावा, फ़िल्टर पर क्लिक करके, ऑब्जेक्ट का तेज़ी से पता लगाया जा सकता है , या Control+F (Mac पर Command+F) को दबाकर और कोई क्लास या पैकेज डालकर नाम डालें. नतीजों को खोजने के लिए, तरीके के नाम का इस्तेमाल करें ड्रॉपडाउन मेन्यू से, कॉलस्टैक के हिसाब से व्यवस्थित करें. अगर आपको सामान्य एक्सप्रेशन के हिसाब से, Regex के बगल में मौजूद बॉक्स को चुनें. इसके आगे स्थित बॉक्स को चेक करें अगर आपकी खोज क्वेरी केस-सेंसिटिव (बड़े और छोटे अक्षरों में अंतर) है, तो केस मैच करें.
  2. इंस्टेंस व्यू पैनल में, किसी इंस्टेंस पर क्लिक करें. रेफ़रंस टैब नीचे दिखाई देता है, जो उस ऑब्जेक्ट का प्रत्येक संदर्भ दिखाता है.

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

  3. पहचान फ़ाइलें टैब में, अगर आपको कोई ऐसी पहचान मिलती है जो मेमोरी लीक करने के लिए, उस पर राइट क्लिक करें और इंस्टेंस पर जाएं को चुनें. इससे, संबंधित इंस्टेंस, जो आपको अपना इंस्टेंस डेटा दिखाता है.

अपने हीप डंप में, नीचे दी गई किसी वजह से मेमोरी लीक होने की जांच करें:

  • Activity, Context, View, Drawable, और ऐसी अन्य चीज़ें जो Activity या Context कंटेनर का संदर्भ है.
  • नॉन-स्टैटिक इनर क्लास, जैसे कि Runnable, जिन्हें होल्ड किया जा सकता है Activity इंस्टेंस.
  • ऐसी कैश मेमोरी जिनमें ज़रूरत से ज़्यादा समय तक चीज़ों को रखा जाता है.

हीप डंप को HPROF फ़ाइल के तौर पर सेव करें

हीप डंप को कैप्चर करने के बाद, डेटा को सिर्फ़ मेमोरी प्रोफ़ाइलर में देखा जा सकता है जब प्रोफ़ाइलर चल रहा हो. प्रोफ़ाइलिंग सेशन से बाहर निकलने पर, हीप डंप को चुनें. इसलिए, अगर आपको इसे बाद में समीक्षा के लिए सेव करना है, तो हीप डंप को एक्सपोर्ट करें HPROF फ़ाइल में सेव करें. Android Studio 3.1 और इससे पहले के वर्शन में, कैप्चर को फ़ाइल में एक्सपोर्ट करें बटन टाइमलाइन के नीचे, टूलबार की बाईं ओर है; इंच Android Studio 3.2 और उसके बाद के वर्शन में, एक्सपोर्ट हीप डंप बटन मौजूद है सेशन पैनल में हर हीप डंप एंट्री के दाईं ओर. इस रूप में एक्सपोर्ट करें डायलॉग बॉक्स दिखने पर, .hprof फ़ाइल नाम के एक्सटेंशन के साथ फ़ाइल सेव करें.

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

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

हीप डंप फ़ाइल इंपोर्ट करना

HPROF (.hprof) फ़ाइल इंपोर्ट करने के लिए, नया प्रोफ़ाइलिंग सेशन शुरू करें पर क्लिक करें में सेशन पैनल में, फ़ाइल से लोड करें को चुनें. इसके बाद, फ़ाइल से फ़ाइल चुनें ब्राउज़र खोलें.

आप किसी HPROF फ़ाइल को फ़ाइल ब्राउज़र से खींचकर एडिटर विंडो.

मेमोरी प्रोफ़ाइलर में लीक का पता लगाने की सुविधा

मेमोरी प्रोफ़ाइलर में हीप डंप का विश्लेषण करते समय, प्रोफ़ाइलिंग को फ़िल्टर किया जा सकता है वह डेटा जो Android Studio के मुताबिक, Activity और आपके ऐप्लिकेशन में Fragment इंस्टेंस.

फ़िल्टर में इस तरह का डेटा शामिल होता है:

  • Activity ऐसे इंस्टेंस जिन्हें खत्म कर दिया गया है, लेकिन इनका रेफ़रंस अब भी लिया जा रहा है.
  • Fragment इंस्टेंस, जिनके पास मान्य FragmentManager नहीं हैं, लेकिन अब भी हैं इस्तेमाल किया जा रहा है.

कुछ मामलों में, जैसे कि फ़िल्टर, गलत नतीजे दिखा सकता है पॉज़िटिव:

  • एक Fragment बना दिया गया है, लेकिन उसका अभी तक इस्तेमाल नहीं किया गया है.
  • Fragment को कैश मेमोरी में सेव किया जा रहा है, लेकिन FragmentTransaction के हिस्से के तौर पर नहीं.

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

प्रोफ़ाइलर: मेमोरी लीक का पता लगाने की सुविधा

सातवीं इमेज. मेमोरी लीक के लिए हीप डंप को फ़िल्टर करना.

अपनी याद को प्रोफ़ाइल में रखने से जुड़ी तकनीकें

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

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

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

जानकारी: ऊपर बताए गए चरणों को पूरा करने के लिए, मंकीरनर टेस्ट फ़्रेमवर्क शामिल है.