Android में, कई तरह की परफ़ॉर्मेंस प्रोफ़ाइलें रिकॉर्ड की जा सकती हैं. प्रोफ़ाइल इकट्ठा करने से, इन समस्याओं को डीबग करने में मदद मिलती है: आपका ऐप्लिकेशन कितनी तेज़ी से चलता है, वह कितनी मेमोरी इस्तेमाल करता है, वह कितनी पावर खर्च करता है वगैरह.
इस दस्तावेज़ में, सबसे काम की प्रोफ़ाइल के टाइप और परफ़ॉर्मेंस से जुड़ी सामान्य समस्याओं को डीबग करने के लिए, हर टाइप का इस्तेमाल कब करना चाहिए, इसके बारे में बताया गया है.
सिस्टम ट्रेस
सिस्टम ट्रेस एक अहम प्रोफ़ाइल है. इसमें प्रोसेस, थ्रेड, टाइमिंग की जानकारी, सीपीयू और टास्क के एक्ज़ीक्यूशन, और सिस्टम या उपयोगकर्ता के तय किए गए इवेंट की जानकारी होती है.
ऐप्लिकेशन के नज़रिए से, ट्रेस में मौजूद जानकारी कई तरह की हो सकती है. जैसे, लेटेंसी, जंक, मेमोरी, बैटरी वगैरह.
सिस्टम ट्रेस में, कोड से ट्रिगर होने वाले ये इवेंट शामिल होते हैं. इन्हें सिस्टम या उपयोगकर्ता तय कर सकता है. कोड से ट्रिगर होने वाले इवेंट, वे इवेंट होते हैं जिन्हें उपयोगकर्ता फ़ंक्शन कॉल के ज़रिए ट्रिगर कर सकते हैं.
- ट्रेस स्लाइस: ये आपके कोड में अलग-अलग पॉइंट के बीच का समय दिखाते हैं. इन्हें
Trace.beginSectionऔरTrace.endSectionएपीआई की मदद से जोड़ा जा सकता है. - ट्रेस काउंटर: ये न्यूमैरिक वैल्यू होती हैं, जो मेट्रिक दिखाती हैं. जैसे, हीप साइज़. इन्हें
Trace.setCounterएपीआई की मदद से जोड़ा जा सकता है.
सिस्टम ट्रेस में मेट्रिक भी शामिल होती हैं. इन्हें PerfettoSQL क्वेरी से बनाया जा सकता है. इनका इस्तेमाल, विश्लेषण करने या ट्रेस की तुलना करने के लिए किया जा सकता है.
हमारा सुझाव है कि इन टास्क को पूरा करने के लिए, सिस्टम ट्रेस का इस्तेमाल करें:
लेटेंसी की समस्याओं का पता लगाना. लेटेंसी की समस्याओं का पता लगाने के लिए, सिस्टम ट्रेस सबसे सही होते हैं. ये समस्याएं, देरी, इंतज़ार या शेड्यूल करने से जुड़ी समस्याओं की वजह से होती हैं. सैंपल पर आधारित प्रोफ़ाइल जैसी अन्य प्रोफ़ाइलर, टाइमिंग की वह जानकारी नहीं देते जो सिस्टम ट्रेस देते हैं.
डुप्लीकेट कंप्यूटेशन ढूंढना. ट्रेसिंग से यह पता चल सकता है कि कुछ कैलकुलेशन बार-बार हो रही हैं या नहीं. इससे यह पता चल सकता है कि कोई ऑपरेशन ज़रूरी है या नहीं.
लॉक कंटेंशन की समस्याओं का पता लगाना. थ्रेड की स्थितियों और स्लाइस की जानकारी से यह पता चलता है कि संसाधन कब ब्लॉक किए गए थे. इससे यह पता लगाया जा सकता है कि लॉक (जैसे,
synchronizedब्लॉक) की वजह से, उपयोगकर्ता के सफ़र में देरी हो रही है या नहीं.अपने ऐप्लिकेशन में मल्टी-थ्रेडिंग को समझना. ट्रेस, कई थ्रेड का व्यू दिखाते हैं. इसमें हर थ्रेड की स्थिति और सिस्टम या आपके ऐप्लिकेशन से जोड़े गए ट्रेस स्लाइस दिखते हैं. इस मल्टी-थ्रेड व्यू से यह समझने में मदद मिलती है कि कौनसे थ्रेड चालू हैं, कौनसे स्लीपिंग मोड में हैं या वे क्या चला रहे हैं और वे कैसे इंटरैक्ट करते हैं.
परफ़ॉर्मेंस का बेहतर विश्लेषण करना. बेहतर यूज़र इंटरफ़ेस और अलग-अलग तरह की जानकारी दिखाने की सुविधा की वजह से, सिस्टम ट्रेस, परफ़ॉर्मेंस से जुड़ी कई समस्याओं को डीबग करने के लिए काम के होते हैं. इनमें लेटेंसी, मेमोरी, और बैटरी के इस्तेमाल से जुड़ी समस्याएं शामिल हैं.
सिस्टम ट्रेस, PerfettoSQL का इस्तेमाल करके क्वेरी करने की सुविधा भी देते हैं. इस अहम सुविधा से, ये काम किए जा सकते हैं:
- खास डेटा निकालना.
- ट्रेस डेटा को कस्टम मेट्रिक में बदलना.
- क्वेरी से डीबग ट्रैक बनाना, ताकि Perfetto यूज़र इंटरफ़ेस (यूआई) में उन चीज़ों को विज़ुअलाइज़ करना आसान हो जिनकी आपको सबसे ज़्यादा ज़रूरत है.
- Perfetto यूज़र इंटरफ़ेस (यूआई) में सीधे तौर पर, बेहतर विश्लेषण करना.
स्टैक सैंपल प्रोफ़ाइलें
स्टैक सैंपल प्रोफ़ाइलें, कोड के एक्ज़ीक्यूशन के सैंपल रिकॉर्ड करके काम करती हैं. साथ ही, थ्रेड के सीपीयू पर टास्क चलाने के दौरान, सेट की गई दर पर कॉल स्टैक की जानकारी सेव करती हैं. इससे, यह अहम जानकारी मिलती है कि एक्ज़ीक्यूशन के दौरान आपका कोड क्या कर रहा है.
हमारा सुझाव है कि इन कामों के लिए, स्टैक सैंपल का इस्तेमाल करें:
- हॉटस्पॉट ऑप्टिमाइज़ करना. स्टैक सैंपल की मदद से, आपके कोड के उन हिस्सों की पहचान की जा सकती है जिनमें सीपीयू की गतिविधि ज़्यादा होती है. इसका मतलब है कि थ्रेड अक्सर "रनिंग" स्थिति में होता है.
- कोड के एक्ज़ीक्यूशन को समझना. स्टैक सैंपल की मदद से, अपने कोडबेस के कुल व्यवहार को समझा जा सकता है.
- उस कोड की पहचान करना जिसे नहीं चलाना चाहिए. आपको ऐसे कॉल स्टैक मिल सकते हैं जिन्हें चलाना ही नहीं चाहिए था. इससे ऑप्टिमाइज़ेशन के तुरंत मौके मिलते हैं.
हीप डंप
Java हीप डंप, आपके ऐप्लिकेशन की Java हीप मेमोरी का स्नैपशॉट दिखाते हैं. इस स्नैपशॉट में, सभी ऑब्जेक्ट और यह जानकारी शामिल होती है कि डंप लिए जाने के समय वे एक-दूसरे को कैसे रेफ़र करते हैं.
हमारा सुझाव है कि इन कामों के लिए, हीप डंप इकट्ठा करें:
- डुप्लीकेट ऑब्जेक्ट का पता लगाना. हीप डंप में, लाइव ऑब्जेक्ट की संख्या दिखती है. इससे डुप्लीकेट ऑब्जेक्ट को ट्रैक करने में मदद मिलती है. इनमें ऑब्जेक्ट रेफ़रंस भी शामिल होते हैं. इससे आपको कोड की उस जगह का पता लगाने में मदद मिलती है जहां ऑब्जेक्ट बनाए गए थे.
- मेमोरी लीक ढूंढना. हीप डंप से, उस मेमोरी का पता चल सकता है जिसका इस्तेमाल डंप लिए जाने के समय नहीं किया जाना चाहिए था. इससे मेमोरी लीक होने की संभावना का पता चलता है.
- उन ऑब्जेक्ट की पहचान करना जिन्हें ऑप्टिमाइज़ किया जा सकता है. हीप डंप में, ज़्यादा मेमोरी इस्तेमाल करने वाले ऑब्जेक्ट और उनकी संख्या दिखती है. इससे मेमोरी के गलत इस्तेमाल के पैटर्न की पहचान करने में मदद मिलती है.
हीप प्रोफ़ाइलें
हीप प्रोफ़ाइलें, नेटिव और Java, दोनों वर्शन में उपलब्ध हैं. ये मेमोरी से जुड़ी समस्याओं को डीबग करने के लिए सबसे सही हैं. ये कॉल स्टैक सैंपल की तरह होती हैं. हालांकि, इनमें सीपीयू साइकल मेज़र करने के बजाय, मेमोरी के लिए जगह तय किए जाने पर सैंपल लिए जाते हैं.
हमारा सुझाव है कि इन कामों के लिए, हीप प्रोफ़ाइल का इस्तेमाल करें:
- मेमोरी चर्न कम करना. हीप प्रोफ़ाइल में, मेमोरी के लिए जगह तय किए जाने के लिए, कोड की जगहों के साथ सैंपल मिलते हैं. इससे आपको उन जगहों की पहचान करने में मदद मिलती है जहां कई अस्थायी ऑब्जेक्ट बनाए जाते हैं. इससे आपके ऐप्लिकेशन में, गार्बेज कलेक्शन (जीसी) की प्रोसेस बार-बार हो सकती है.
- मेमोरी लीक का पता लगाना. मेमोरी लीक का पता लगाने और उन्हें ठीक करने के लिए, हीप प्रोफ़ाइल का इस्तेमाल अन्य मेमोरी प्रोफ़ाइल के साथ किया जा सकता है. इससे आपको उन जगहों का पता लगाने में मदद मिलती है जहां उम्मीद से ज़्यादा मेमोरी के लिए जगह तय की जा रही है.
प्रोफ़ाइलें जोड़ना
अक्सर, परफ़ॉर्मेंस का विश्लेषण करने के लिए, सिर्फ़ एक प्रोफ़ाइल का इस्तेमाल किया जाता है. हालांकि, कई प्रोफ़ाइलें इकट्ठा करने या एक ही कंबाइंड प्रोफ़ाइल का इस्तेमाल करने से, अक्सर ज़्यादा जानकारी मिलती है. साथ ही, उन मुश्किल समस्याओं का पता लगाने में मदद मिलती है जिनका पता सिर्फ़ एक प्रोफ़ाइल से नहीं लगाया जा सकता.
इन स्थितियों में, प्रोफ़ाइलें जोड़ना फ़ायदेमंद होता है:
पहली स्थिति: इंस्ट्रूमेंट न किए गए कोड की जांच करना. सिस्टम ट्रेस में, उन कार्रवाइयों के लिए लेटेंसी दिख सकती है जिन्हें आपने पहले ही इंस्ट्रूमेंट कर लिया है. हालांकि, आपको उन समय के दौरान चल रहे, इंस्ट्रूमेंट न किए गए कोड के हिस्सों के बारे में ज़्यादा जानकारी की ज़रूरत हो सकती है. जांच करने के लिए, एक्ज़ीक्यूट किए गए कोड को समझने के लिए, कॉल स्टैक प्रोफ़ाइल लें. इसके बाद, इस जानकारी से, ज़्यादा ट्रेस स्लाइस जोड़कर, ट्रेसिंग को बेहतर बनाया जा सकता है.
दूसरी स्थिति: मेमोरी लीक और गार्बेज कलेक्शन का विश्लेषण करना. मान लें कि सिस्टम ट्रेस में, Java हीप मेमोरी में लगातार बढ़ोतरी दिखती है. इसकी वजह है कि मेमोरी के लिए जगह तय की जा रही है. इससे गार्बेज कलेक्शन (जीसी) की प्रोसेस बार-बार हो रही है. तय किए गए ऑब्जेक्ट को समझने के लिए, हीप प्रोफ़ाइल या हीप डंप लें. इस कंबाइंड तरीके से, मेमोरी के इस्तेमाल को कम करने के तरीके ढूंढने में मदद मिलती है. उदाहरण के लिए, कैश मेमोरी का इस्तेमाल करके, ऑप्टिमाइज़ की जा सकने वाली या फ़ालतू मेमोरी के लिए जगह तय करने की प्रोसेस को कम करने से, जीसी की प्रोसेस को रोका जा सकता है.