उबंटू पर मेमोरी लीक होने के कई कारण हो सकते हैं, लेकिन सौभाग्य से जब वे होते हैं तो यह स्पष्ट होता है। बगी कोड अक्सर सबसे बड़ा कारण होता है, क्योंकि प्रोग्रामर्स के पास यह जांचने का अवसर नहीं हो सकता है कि अब आवश्यक नहीं होने वाली मेमोरी जारी हो जाती है। यदि आप अस्थिर पैकेज इंस्टॉल कर रहे हैं या सोर्स से कोड कंपाइल कर रहे हैं, तो आप इस कारण से मेमोरी लीक से निपट रहे होंगे। आप शायद उन्हें नोटिस करना शुरू कर देंगे क्योंकि सॉफ़्टवेयर एप्लिकेशन पैकेज आउट ऑफ मेमोरी होने की शिकायत करना शुरू कर देंगे जब आपके पास पर्याप्त से अधिक फिजिकल RAM इंस्टॉल हो।
यदि आप मेमोरी लीक के बारे में चिंतित हैं, तो टर्मिनल में बार-बार free टाइप करने का प्रयास करें। यदि आप अचानक RAM उपयोग को तेजी से बढ़ते हुए देखते हैं, तो आपने पहले ही एक मेमोरी लीक का पता लगा लिया है। यदि आपको इस दौरान एक त्रुटि प्राप्त होती है जिसमें लिखा होता है bash: Not enough Memory और आपके पास केवल एक टर्मिनल या यहां तक कि सिर्फ एक वर्चुअल कंसोल खुला है, तो आप लगभग निर्विवाद रूप से एक मेमोरी लीक से निपट रहे हैं। कुछ मेमोरी लीक थोड़ी अधिक सूक्ष्म हो सकती हैं, लेकिन उबंटू और इसके विभिन्न स्पिन-ऑफ में ऐसे टूल्स और पैकेज हैं जो इनका पता लगाने में आपकी सहायता कर सकते हैं।
उबंटू में मेमोरी लीक का पता लगाना
चूंकि मेमोरी लीक का पता लगाने के लिए उपयोग किए जाने वाले टूल्स मुख्य रूप से CLI प्रॉम्प्ट के आसपास आधारित हैं, इससे कोई फर्क नहीं पड़ता कि आप उन्हें उबंटू के किस संस्करण पर चलाते हैं। ये नियमित उबंटू में यूनिटी टर्मिनल के अंदर, उबंटू सर्वर में वर्चुअल कंसोल से, Lubuntu में lxterm में, Kubuntu में Konsole में, या यहां तक कि Xubuntu में Xfce के अंदर ठीक काम करना चाहिए। sudo -s जैसे एक साधारण कार्य को करने का प्रयास करें और शुरू करने के लिए अपना पासवर्ड टाइप करें।
यदि सही ढंग से किया गया है तो यह आपको एक रूट शेल देना चाहिए, लेकिन यदि आप पहले से ही बहुत दूर जा चुके लीक के साथ काम कर रहे हैं तो यह मेमोरी त्रुटि का कारण बन सकता है। यदि आप वास्तव में एक रूट शेल तक पहुंचने में सक्षम हैं, तो echo 3 > /proc/sys/vm/drop_caches टाइप करने का प्रयास करें, एंटर कुंजी दबाएं और फिर exit टाइप करें। यह देखने के लिए फिर से free या free -m चलाएं कि क्या इसने मेमोरी जारी करने में मदद की है।
कुछ प्रोग्रामर्स का तर्क है कि कर्नेल को अपने कैश को ड्रॉप करने के लिए मजबूर करने का कोई मतलब नहीं है, क्योंकि अतिरिक्त फिजिकल मेमोरी की आवश्यकता होते ही उन्हें फ्लश और इस प्रकार पुनः प्राप्त किया जाना चाहिए। हालांकि, इन कैश को जबरन फ्लश करने से सिस्टम प्रदर्शन को नुकसान होगा, ध्यान रखें कि यह केवल एक टेस्ट है। एक बार जब आप सिस्टम को रीबूट कर लेते हैं, तो लिनक्स कर्नेल को एक बार फिर से मेमोरी कैश को उसी तरह असेंबल करना चाहिए जैसे वे पहली बार में थे।
कुछ लोगों ने sync; sudo echo 3 > /proc/sys/vm/drop_caches लाइन को एक स्क्रिप्ट में जोड़ने का सुझाव दिया है जिसे क्रॉन लगातार चलाता है, लेकिन यह पहली जगह में मेमोरी कैशिंग के उद्देश्य को विफल कर देता है। फ्री मेमोरी केवल अनयूज्ड RAM है, और इसका मतलब है कि डेटा को बहुत धीमे इलेक्ट्रोमैकेनिकल या NAND स्टोरेज डिवाइस से लोड करना होगा। चाहे ये डिवाइस कितने भी तेज़ हों, वे RAM जितने तेज़ नहीं हैं, जिसका अर्थ है कि जहां आपको मेमोरी लीक को ठीक करना चाहिए, वहीं एक बार जब आप इसे इष्टतम सेटिंग पर सेट कर लेते हैं तो आपको कैश सिस्टम के साथ छेड़छाड़ नहीं करनी चाहिए।
यदि आपने फैसला किया है कि आपके पास वास्तव में एक सुसंगत मेमोरी लीक है जो आपकी मशीन का उपयोग करते समय समय-समय पर होता है और इसे विशेष रूप से कम नहीं किया जा सकता है, लेकिन आपके पास अभी भी CLI एक्सेस है, तो top कमांड चलाने का प्रयास करें। यह आपको रनिंग प्रोसेस की एक सूची देनी चाहिए।
यदि उबंटू आपको top के बारे में असामान्य त्रुटि देता है, तो इस प्रोग्राम के और भी सरल संस्करण तक पहुंचने के लिए busybox top जारी करने का प्रयास करें। एक बार सूची मिल जाने पर, %MEM या इसी तरह के कॉलम को देखें कि कौन से एप्लिकेशन को सबसे अधिक मेमोरी आवंटित की गई है। जबकि आप PID को नोट कर सकते हैं और सटीक PID नंबर पर kill कमांड जारी कर सकते हैं, यह केवल एप्लिकेशन को बंद करने के लिए मजबूर करेगा। उनके द्वारा उपयोग की जाने वाली मेमोरी अभी भी आपके ऐसा करने के बाद जारी नहीं हो सकती है, हालांकि यह निश्चित रूप से एक शॉट के लायक है।
यदि आपको कोई ऐसा एप्लिकेशन मिलता है जो बड़ी मात्रा में मेमोरी का उपयोग कर रहा है, तो पिछली स्क्रीन से PID नंबर के साथ q दबाकर छोड़ें और फिर kill #### आज़माएं। सिस्टम प्रोसेस को इस तरह नहीं मारा जाना चाहिए, न ही उस चीज़ को जिसमें आपका अनसेव्ड काम है। इसे Ctrl+Alt+Del टास्क लिस्ट के साथ कुछ मारने के समान समझें, जिसका उपयोग आप इस ही प्रक्रिया के लिए भी कर सकते हैं।
जब आपको कोई ऐसा प्रोग्राम मिल जाता है जिससे यह लगातार हो रहा है, तो आप इसे भविष्य में व्यवहार को रोकने के लिए कॉन्फ़िगर कर सकते हैं। प्रत्येक व्यक्तिगत प्रोग्राम, निश्चित रूप से, एक अलग उपाय की आवश्यकता होगी, जो केवल मेमोरी लीक का पता लगाने के कार्य से परे है।
यदि आप केवल एप्लिकेशन का समस्या निवारण नहीं कर रहे हैं, बल्कि वास्तव में कोड के साथ काम कर रहे हैं तो आपके पास कुछ अन्य उपाय हैं। उबंटू और इसके डेरिवेटिव आपको प्रोग्रामिंग के लिए membarrier, memusage और memusagestat C रूटीन प्रदान करते हैं।
बस इन महत्वपूर्ण रूटीन पर लिनक्स प्रोग्रामर के मैनुअल पेज देखने के लिए man membarrier, man memusage या man memusagestat का उपयोग करें। यदि भविष्य के उबंटू संस्करणों के रूप में लाइब्रेरी के नए संस्करणों में अपग्रेड होते हैं, तो परिवर्तन हमेशा यहां उल्लिखित होंगे।
यदि आपको ग्राफिकल सामग्री की आवश्यकता है, तो memusagestat मेमोरी उपयोग के ग्राफिकल प्रतिनिधित्व को PNG फाइल में सहेजने का विकल्प भी प्रदान करता है। यह इसे उपयोगिताओं के लेखकों के लिए भी एक आकर्षक विशेषता बनाता है, क्योंकि इसका उपयोग उन एप्लिकेशन बनाने के लिए किया जा सकता है जो नियमित रूप से मेमोरी लीक की जांच करते हैं।
आप memprof इंस्टॉल करना भी चाह सकते हैं, जो मेमोरी लीक खोजने में आपकी सहायता करने के लिए मेमोरी उपयोग को प्रोफाइल करने का एक टूल है। यह एक प्रोग्राम में प्रत्येक फ़ंक्शन द्वारा कितनी मेमोरी आवंटित की जाती है, इसके बारे में एक प्रोफाइल उत्पन्न करता है। यह मौजूदा मेमोरी को स्कैन करके उन ब्लॉकों को भी ढूंढ सकता है जिन्हें आवंटित किया गया है लेकिन अब वास्तविक संदर्भ नहीं हैं। यह एक लाइब्रेरी को प्री-लोड करके ऐसा करता है ताकि स्टैंडर्ड C लाइब्रेरी की मेमोरी आवंटन सुविधाओं को ओवरराइड किया जा सके।
यदि आप इसका उपयोग करने की योजना बनाते हैं, तो अपने कोड की शुरुआत से include memprof लाइन को रिलीज करने से पहले हटाना सुनिश्चित करें। इसका उपयोग यह सुनिश्चित करने के लिए किया जाता है कि आपके पास कोई लीक नहीं है, लेकिन यदि आप अपना कोड पैकेज करते हैं और इसे रिपॉजिटरी में जारी करते हैं तो यह निर्भरता नहीं बनना चाहिए।
लेखक के बारे में

केविन एरोज़
केविन एरोज़ एक अत्यधिक अनुभवी और जानकार प्रौद्योगिकी विशेषज्ञ हैं जिनके पास एक दशक से अधिक का उद्योग अनुभव है। उनके पास माइक्रोसॉफ्ट सर्टिफाइड टेक्नोलॉजी स्पेशलिस्ट (MCTS) प्रमाणन है और नवीनतम तकनीकी विकास पर अपडेट रहने का गहरा जुनून है। केविन ने तकनीक से संबंधित विषयों की एक विस्तृत श्रृंखला पर व्यापक रूप से लिखा है, जिसमें सॉफ़्टवेयर विकास, साइबर सुरक्षा और क्लाउड कंप्यूटिंग जैसे क्षेत्रों में उनकी विशेषज्ञता और ज्ञान का प्रदर्शन होता है। तकनीकी क्षेत्र में उनके योगदान को उनके साथियों द्वारा व्यापक रूप से मान्यता प्राप्त और सम्मानित किया गया है, और उन्हें जटिल तकनीकी अवधारणाओं को स्पष्ट और संक्षिप्त तरीके से समझाने की उनकी क्षमता के लिए उच्च माना जाता है।