Android प्लैटफ़ॉर्म इस सिद्धांत पर काम करता है कि खाली मेमोरी, बर्बाद की गई मेमोरी है. यह हमेशा उपलब्ध मेमोरी का इस्तेमाल करने की कोशिश करता है. उदाहरण के लिए, सिस्टम ऐप्लिकेशन बंद होने के बाद भी उन्हें मेमोरी में सेव रखता है, ताकि उपयोगकर्ता उन्हें तुरंत फिर से खोल सके. इस वजह से, Android डिवाइसों में अक्सर बहुत कम खाली मेमोरी होती है. मेमोरी मैनेजमेंट, सिस्टम की ज़रूरी प्रोसेस और कई उपयोगकर्ता ऐप्लिकेशन के बीच मेमोरी को सही तरीके से बांटने के लिए ज़रूरी है.
इस पेज पर, इस बारे में बुनियादी जानकारी दी गई है कि Android, सिस्टम और उपयोगकर्ता के ऐप्लिकेशन के लिए मेमोरी कैसे असाइन करता है. इसमें यह भी बताया गया है कि कम मेमोरी होने पर ऑपरेटिंग सिस्टम कैसे काम करता है.
अलग-अलग तरह की पुरानी तस्वीरें
Android डिवाइसों में तीन तरह की मेमोरी होती है: रैम, zRAM, और स्टोरेज. ध्यान दें कि सीपीयू और जीपीयू, दोनों एक ही रैम को ऐक्सेस करते हैं.
पहली इमेज. मेमोरी के टाइप - रैम, zRAM, और स्टोरेज
रैम, सबसे तेज़ मेमोरी होती है. हालांकि, आम तौर पर इसका साइज़ सीमित होता है. आम तौर पर, हाई-एंड डिवाइसों में सबसे ज़्यादा रैम होती है.
zRAM, RAM का एक हिस्सा होता है. इसका इस्तेमाल स्वैप स्पेस के लिए किया जाता है. zRAM में डेटा डालने पर, उसे कंप्रेस किया जाता है. इसके बाद, zRAM से डेटा कॉपी करने पर, उसे डीकंप्रेस किया जाता है. RAM का यह हिस्सा, zRAM में पेजों को ले जाने या उससे बाहर निकालने पर, साइज़ में बढ़ता या घटता है. डिवाइस बनाने वाली कंपनियां, ज़्यादा से ज़्यादा साइज़ सेट कर सकती हैं.
स्टोरेज में सभी ऐप्लिकेशन, लाइब्रेरी, और प्लैटफ़ॉर्म के लिए, फ़ाइल सिस्टम और ऑब्जेक्ट कोड जैसे सभी स्थायी डेटा शामिल होते हैं. स्टोरेज की क्षमता, अन्य दो तरह की मेमोरी की तुलना में बहुत ज़्यादा होती है. Android में, स्टोरेज का इस्तेमाल स्वैप स्पेस के लिए नहीं किया जाता. ऐसा इसलिए है, क्योंकि बार-बार डेटा लिखने से इस मेमोरी पर असर पड़ सकता है और स्टोरेज मीडियम की लाइफ़ कम हो सकती है.
मेमोरी पेज
रैम को पेजों में बांटा जाता है. आम तौर पर, हर पेज की मेमोरी 4 केबी होती है.
पेजों को मुफ़्त या इस्तेमाल किया गया के तौर पर मार्क किया जाता है. फ़्री पेज, इस्तेमाल नहीं की गई रैम होती है. इस्तेमाल किए गए पेज, ऐसी रैम होती है जिसका सिस्टम लगातार इस्तेमाल कर रहा होता है. इन्हें इन कैटगरी में बांटा जाता है:
- कैश मेमोरी: यह स्टोरेज में मौजूद किसी फ़ाइल से जुड़ी मेमोरी होती है. उदाहरण के लिए, कोड या मेमोरी-मैप की गई फ़ाइलें. कैश मेमोरी दो तरह की होती है:
- निजी: इसका मालिकाना हक किसी एक प्रोसेस के पास होता है और इसे शेयर नहीं किया जाता
- क्लीन: स्टोरेज पर मौजूद फ़ाइल की बिना बदलाव वाली कॉपी. इसे
kswapdमिटा सकता है, ताकि ज़्यादा मेमोरी खाली हो सके - डर्टी: स्टोरेज पर मौजूद फ़ाइल की बदली गई कॉपी;
kswapdकी मदद से इसे zRAM में ले जाया जा सकता है या कंप्रेस किया जा सकता है, ताकि खाली मेमोरी बढ़ाई जा सके
- क्लीन: स्टोरेज पर मौजूद फ़ाइल की बिना बदलाव वाली कॉपी. इसे
- शेयर किया गया: इसका इस्तेमाल कई प्रोसेस करती हैं
- क्लीन: स्टोरेज में मौजूद फ़ाइल की ऐसी कॉपी जिसमें कोई बदलाव नहीं किया गया है. इसे
kswapdमिटा सकता है, ताकि मेमोरी खाली हो सके - डर्टी: स्टोरेज पर मौजूद फ़ाइल की बदली गई कॉपी; इससे स्टोरेज में मौजूद फ़ाइल में बदलाव किए जा सकते हैं, ताकि
kswapdतक खाली मेमोरी बढ़ाई जा सके. इसके अलावा,msync()याmunmap()का इस्तेमाल करके भी ऐसा किया जा सकता है
- क्लीन: स्टोरेज में मौजूद फ़ाइल की ऐसी कॉपी जिसमें कोई बदलाव नहीं किया गया है. इसे
- निजी: इसका मालिकाना हक किसी एक प्रोसेस के पास होता है और इसे शेयर नहीं किया जाता
- पहचान छिपाकर पूछा गया सवाल: मेमोरी, स्टोरेज में मौजूद किसी फ़ाइल से नहीं जुड़ी है. उदाहरण के लिए,
mmap()नेMAP_ANONYMOUSफ़्लैग सेट करके मेमोरी असाइन की है- डर्टी:
kswapdकी मदद से, इसे zRAM में ले जाया/कंप्रेस किया जा सकता है, ताकि खाली मेमोरी बढ़ाई जा सके
- डर्टी:
सिस्टम, रैम को मैनेज करता रहता है. इसलिए, समय के साथ-साथ खाली और इस्तेमाल किए गए पेजों की संख्या बदलती रहती है. इस सेक्शन में बताए गए कॉन्सेप्ट, कम मेमोरी की समस्या को मैनेज करने के लिए ज़रूरी हैं. इस दस्तावेज़ के अगले सेक्शन में, इनके बारे में ज़्यादा जानकारी दी गई है.
मेमोरी को मैनेज करने की सुविधा कम होना
Android में कम मेमोरी की समस्या से निपटने के लिए, दो मुख्य तरीके हैं: कर्नेल स्वैप डीमन और लो-मेमोरी किलर.
कर्नेल स्वैप डीमन
कर्नेल स्वैप डेमॉन (kswapd) Linux कर्नेल का हिस्सा है. यह इस्तेमाल की गई मेमोरी को खाली मेमोरी में बदलता है. डिवाइस पर मेमोरी कम होने पर, यह डेमॉन चालू हो जाता है. Linux कर्नल, कम और ज़्यादा फ़्री मेमोरी थ्रेशोल्ड को बनाए रखता है.
जब खाली मेमोरी, थ्रेशोल्ड से कम हो जाती है, तब kswapd मेमोरी खाली करना शुरू कर देता है. मुफ़्त मेमोरी, ज़्यादा थ्रेशोल्ड तक पहुंचने के बाद, kswapd मेमोरी वापस पाना बंद कर देता है.
kswapd, साफ़ पेजों को मिटाकर उन्हें वापस पा सकता है. ऐसा इसलिए, क्योंकि ये स्टोरेज से बैक अप लिए जाते हैं और इनमें कोई बदलाव नहीं किया गया है. अगर कोई प्रोसेस, मिटाए गए किसी पेज को ऐक्सेस करने की कोशिश करती है, तो सिस्टम उस पेज को स्टोरेज से RAM में कॉपी कर देता है. इस ऑपरेशन को डिमांड पेजिंग कहा जाता है.
दूसरी इमेज. स्टोरेज की मदद से बनाए गए पेज को मिटाया गया
kswapd, कैश मेमोरी में सेव किए गए निजी डर्टी पेजों और अनाम डर्टी पेजों को zRAM में ले जा सकता है. यहां उन्हें कंप्रेस किया जाता है. ऐसा करने से, रैम में उपलब्ध मेमोरी (फ़्री पेज) खाली हो जाती है. अगर कोई प्रोसेस zRAM में मौजूद किसी डर्टी पेज को ऐक्सेस करने की कोशिश करती है, तो पेज को अनकंप्रेस किया जाता है और वापस RAM में ले जाया जाता है. अगर कंप्रेस किए गए पेज से जुड़ी प्रोसेस बंद कर दी जाती है, तो पेज को zRAM से मिटा दिया जाता है.
अगर खाली मेमोरी की मात्रा किसी थ्रेशोल्ड से कम हो जाती है, तो सिस्टम प्रोसेस बंद करना शुरू कर देता है.
तीसरी इमेज. डर्टी पेज को zRAM में ले जाया गया और कंप्रेस किया गया
लो-मेमोरी किलर
कई बार, kswapd सिस्टम के लिए ज़रूरत के मुताबिक मेमोरी खाली नहीं कर पाता. इस मामले में, सिस्टम onTrimMemory() का इस्तेमाल करके, किसी ऐप्लिकेशन को यह सूचना देता है कि मेमोरी कम हो रही है. साथ ही, उसे अपने मेमोरी इस्तेमाल को कम करने के लिए कहता है. अगर यह काफ़ी नहीं है, तो कर्नेल मेमोरी खाली करने के लिए प्रोसेस बंद करना शुरू कर देता है. इसके लिए, यह लो-मेमोरी किलर (एलएमके) का इस्तेमाल करता है.
LMK यह तय करने के लिए कि किस प्रोसेस को बंद करना है, "आउट ऑफ़ मेमोरी" स्कोर का इस्तेमाल करता है. इसे oom_adj_score कहा जाता है. इससे, चल रही प्रोसेस को प्राथमिकता दी जाती है. ज़्यादा स्कोर वाली प्रोसेस को सबसे पहले बंद किया जाता है. बैकग्राउंड में चल रहे ऐप्लिकेशन को सबसे पहले बंद किया जाता है. इसके बाद, सिस्टम प्रोसेस को बंद किया जाता है. यहां दी गई टेबल में, एलएमके स्कोरिंग की कैटगरी को ज़्यादा से कम के क्रम में दिखाया गया है. पहली लाइन में, सबसे ज़्यादा स्कोर वाली कैटगरी के आइटम सबसे पहले हटाए जाएंगे:
चौथी इमेज. Android प्रोसेस, जिसमें सबसे ज़्यादा स्कोर सबसे ऊपर और सबसे कम स्कोर सबसे नीचे है
ऊपर दी गई टेबल में मौजूद अलग-अलग कैटगरी के बारे में यहां बताया गया है:
बैकग्राउंड ऐप्लिकेशन: ऐसे ऐप्लिकेशन जिन्हें पहले चलाया गया था और जो फ़िलहाल चालू नहीं हैं. एलएमके, बैकग्राउंड में चल रहे ऐप्लिकेशन को बंद कर देगा. यह सबसे ज़्यादा
oom_adj_scoreवाले ऐप्लिकेशन से शुरू होगा.पिछला ऐप्लिकेशन: यह बैकग्राउंड में सबसे हाल ही में इस्तेमाल किया गया ऐप्लिकेशन होता है. बैकग्राउंड में चल रहे ऐप्लिकेशन की तुलना में, पिछले ऐप्लिकेशन को ज़्यादा प्राथमिकता (कम स्कोर) मिलती है. ऐसा इसलिए, क्योंकि बैकग्राउंड में चल रहे किसी ऐप्लिकेशन के बजाय, उपयोगकर्ता के पिछले ऐप्लिकेशन पर स्विच करने की संभावना ज़्यादा होती है.
Home ऐप्लिकेशन: यह लॉन्चर ऐप्लिकेशन है. इसे बंद करने पर वॉलपेपर हट जाएगा.
सेवाएं: सेवाएं, ऐप्लिकेशन शुरू करते हैं. इनमें सिंक करना या क्लाउड पर अपलोड करना शामिल हो सकता है.
उपयोगकर्ता को दिखने वाले ऐप्लिकेशन: ये ऐसे ऐप्लिकेशन होते हैं जो फ़ोरग्राउंड में नहीं होते, लेकिन उपयोगकर्ता को किसी न किसी तरह दिखते हैं. जैसे, खोज की प्रोसेस को चलाने वाला ऐप्लिकेशन, जो छोटा यूज़र इंटरफ़ेस (यूआई) दिखाता है या संगीत सुनने वाला ऐप्लिकेशन.
फ़ोरग्राउंड ऐप्लिकेशन: वह ऐप्लिकेशन जिसका इस्तेमाल फ़िलहाल किया जा रहा है. फ़ोरग्राउंड ऐप्लिकेशन को बंद करने पर, ऐसा लगता है कि ऐप्लिकेशन क्रैश हो गया है. इससे उपयोगकर्ता को यह पता चल सकता है कि डिवाइस में कोई गड़बड़ी हो रही है.
परसिस्टेंट (सेवाएं): ये डिवाइस के लिए मुख्य सेवाएं होती हैं. जैसे, टेलीफ़ोनी और वाई-फ़ाई.
सिस्टम: सिस्टम प्रोसेस. इन प्रोसेस को बंद करने पर, ऐसा लग सकता है कि फ़ोन रीबूट हो रहा है.
नेटिव: सिस्टम की ओर से इस्तेमाल की जाने वाली बहुत ही बुनियादी प्रोसेस (उदाहरण के लिए,
kswapd).
डिवाइस बनाने वाली कंपनियां, LMK के काम करने के तरीके में बदलाव कर सकती हैं.
मेमोरी फ़ुटप्रिंट का हिसाब लगाना
कर्नल, सिस्टम में मौजूद सभी मेमोरी पेजों को ट्रैक करता है.
पांचवीं इमेज. अलग-अलग प्रोसेस के लिए इस्तेमाल किए गए पेज
जब यह तय किया जाता है कि कोई ऐप्लिकेशन कितनी मेमोरी का इस्तेमाल कर रहा है, तो सिस्टम को शेयर किए गए पेजों का हिसाब रखना होगा. एक ही सेवा या लाइब्रेरी को ऐक्सेस करने वाले ऐप्लिकेशन, मेमोरी पेज शेयर करेंगे. उदाहरण के लिए, Google Play Services और कोई गेम ऐप्लिकेशन, जगह की जानकारी देने वाली सेवा को शेयर कर सकते हैं. इससे यह तय करना मुश्किल हो जाता है कि कुल मेमोरी में से, सेवा के लिए कितनी मेमोरी है और हर ऐप्लिकेशन के लिए कितनी मेमोरी है.
छठी इमेज. दो ऐप्लिकेशन से शेयर किए गए पेज (बीच में)
किसी ऐप्लिकेशन के लिए मेमोरी फ़ुटप्रिंट का पता लगाने के लिए, इनमें से किसी भी मेट्रिक का इस्तेमाल किया जा सकता है:
- रेज़िडेंट सेट साइज़ (आरएसएस): ऐप्लिकेशन के इस्तेमाल किए गए शेयर किए गए और शेयर न किए गए पेजों की संख्या
- प्रोपोर्शनल सेट साइज़ (पीएसएस): ऐप्लिकेशन के इस्तेमाल किए गए ऐसे पेजों की संख्या जिन्हें शेयर नहीं किया गया है. साथ ही, शेयर किए गए पेजों का बराबर बंटवारा (उदाहरण के लिए, अगर तीन प्रोसेस 3 एमबी शेयर कर रही हैं, तो हर प्रोसेस को पीएसएस में 1 एमबी मिलेगा)
- यूनीक सेट साइज़ (यूएसएस): ऐप्लिकेशन के इस्तेमाल किए गए ऐसे पेजों की संख्या जिन्हें शेयर नहीं किया गया है. इसमें शेयर किए गए पेज शामिल नहीं हैं
पीएसएस, ऑपरेटिंग सिस्टम के लिए तब काम आता है, जब उसे यह जानना होता है कि सभी प्रोसेस में कितनी मेमोरी का इस्तेमाल किया गया है. ऐसा इसलिए, क्योंकि पेजों की गिनती एक से ज़्यादा बार नहीं की जाती. पीएसएस का हिसाब लगाने में ज़्यादा समय लगता है, क्योंकि सिस्टम को यह पता लगाना होता है कि कौनसे पेज शेयर किए गए हैं और कितनी प्रोसेस से शेयर किए गए हैं. आरएसएस, शेयर किए गए और शेयर नहीं किए गए पेजों के बीच अंतर नहीं करता है. इसलिए, इसका हिसाब तेज़ी से लगाया जा सकता है. साथ ही, यह मेमोरी के बंटवारे में होने वाले बदलावों को ट्रैक करने के लिए बेहतर है.
अन्य संसाधन
- मेमोरी मैनेजमेंट के बारे में खास जानकारी
- प्रोसेस और ऐप्लिकेशन लाइफ़साइकल
- Android में मेमोरी के इस्तेमाल के बारे में जानकारी - Google I/O प्रज़ेंटेशन
- Android की मेमोरी और गेम - Google I/O प्रज़ेंटेशन
- Android low memory killer daemon
आपके लिए सुझाव
- ध्यान दें: JavaScript बंद होने पर लिंक का टेक्स्ट दिखता है
- ऐप्लिकेशन के शुरू होने में लगने वाला समय