Java/Kotlin के ऐलोकेशन रिकॉर्ड करें

Java/Kotlin के लिए मेमोरी के बंटवारे को रिकॉर्ड करने से, आपको मेमोरी के ऐसे पैटर्न की पहचान करने में मदद मिलती है जो परफ़ॉर्मेंस से जुड़ी समस्याएं पैदा कर सकते हैं. प्रोफ़ाइलर, ऑब्जेक्ट के असाइनमेंट के बारे में यह जानकारी दिखा सकता है:

  • किस तरह के ऑब्जेक्ट असाइन किए गए थे और उन्होंने कितना स्टोरेज इस्तेमाल किया.
  • हर ऐलोकेशन का स्टैक ट्रेस. इसमें यह भी शामिल है कि किस थ्रेड में ऐलोकेट किया गया है.
  • जब ऑब्जेक्ट को डी-अलॉकेट किया गया था.

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

Java/Kotlin ऐलोकेशन को रिकॉर्ड करने का तरीका

Java/Kotlin के लिए मेमोरी के इस्तेमाल को रिकॉर्ड करने के लिए, प्रोफ़ाइलर के होम टैब में जाकर, मेमोरी के इस्तेमाल को ट्रैक करें (Java/Kotlin के लिए मेमोरी का इस्तेमाल) टास्क को चुनें. ध्यान दें कि Java/Kotlin के लिए मेमोरी असाइनमेंट रिकॉर्ड करने के लिए, आपको डीबग किए जा सकने वाले ऐप्लिकेशन की ज़रूरत होगी. इसके लिए, Profiler: run 'app' as debuggable (complete data) का इस्तेमाल करें.

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

रिकॉर्डिंग के दौरान, गार्बेज कलेक्शन इवेंट को ट्रिगर करने के लिए, गार्बेज आइकॉन पर क्लिक करें.

Java/Kotlin के लिए मेमोरी के बंटवारे की खास जानकारी

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

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

  • कुछ हीप को फ़िल्टर करने के लिए, हीप ड्रॉप-डाउन का इस्तेमाल करें. हीप डंप कैप्चर करते समय उपलब्ध फ़िल्टर के अलावा, JNI हीप में मौजूद क्लास को फ़िल्टर किया जा सकता है. यह वह हीप होता है जो दिखाता है कि Java Native Interface (JNI) रेफ़रंस कहां असाइन और रिलीज़ किए जाते हैं.

  • आवंटन को व्यवस्थित करने का तरीका चुनने के लिए, ड्रॉप-डाउन मेन्यू का इस्तेमाल करें. हीप डंप कैप्चर करते समय उपलब्ध व्यवस्थाओं के अलावा, कॉलस्टैक के हिसाब से भी व्यवस्थित किया जा सकता है.

मेमोरी का हिसाब कैसे लगाया जाता है

आपको सबसे ऊपर जो नंबर दिखते हैं वे उन सभी प्राइवेट मेमोरी पेजों पर आधारित होते हैं जिन्हें आपके ऐप्लिकेशन ने Android सिस्टम के हिसाब से इस्तेमाल किया है. इस संख्या में, सिस्टम या अन्य ऐप्लिकेशन के साथ शेयर किए गए पेज शामिल नहीं होते. मेमोरी काउंट में ये कैटगरी शामिल होती हैं:

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

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

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

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

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

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

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

एलॉकेशन रिकॉर्ड की जांच करना

बंटवारे का रिकॉर्ड देखने के लिए, यह तरीका अपनाएं:

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

किसी भी सूची की एंट्री पर राइट क्लिक करके, उससे जुड़े सोर्स कोड पर जाएं.

ग्लोबल JNI रेफ़रंस देखना

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

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

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

एलॉकेशन कॉल स्टैक टैब से पता चलता है कि आपके कोड में JNI रेफ़रंस कहां-कहां असाइन और रिलीज़ किए गए हैं.

JNI के बारे में ज़्यादा जानने के लिए, JNI के बारे में सुझाव देखें.