मेरे पास कई प्रक्रियाओं के साथ एक सिस्टम (उबंटू) है और एक (या अधिक) मेमोरी रिसाव है। क्या रिसाव की प्रक्रिया को खोजने का कोई अच्छा तरीका है? कुछ प्रक्रियाएं जेवीएम हैं, कुछ नहीं हैं। कुछ घर उगाए गए हैं कुछ खुले स्रोत हैं।मुझे कैसे पता चलेगा कि कौन सी प्रक्रिया मेमोरी लीक कर रही है
उत्तर
कठिन कार्य। मैं आम तौर पर Valgrind जैसे डीबगर/मेमोरी प्रोफाइलर को पकड़ने का सुझाव देता हूं और इसमें एक के बाद प्रोग्राम चलाता हूं। जल्द ही या बाद में आपको वह कार्यक्रम मिलेगा जो लीक करता है और इसे devloper बता सकता है या इसे स्वयं ठीक कर सकता है।
आप top
कमांड चला सकते हैं (गैर-इंटरैक्टिव चलाने के लिए, top -b -n 1
टाइप करें)। अनुप्रयोग जो स्मृति लीक कर रहे हैं देखने के लिए, निम्न स्तंभ पर गौर:
- RPRVT - निवासी निजी पता स्थान आकार
- RSHRD - निवासी साझा पता स्थान आकार
- RSIZE - निवासी स्मृति आकार
- VPRVT - निजी पता स्थान आकार
- VSIZE - कुल स्मृति आकार
मैं यह कोशिश कर रहा था लेकिन जो भी कमांड लाइन तर्क मैं शीर्ष पर जाता हूं, वह इस आउटपुट को आउटपुट नहीं देता है। मुझे 'पीआईडी यूजर पीआर एनआई वीआईआरटी आरईएस एसआर% सीपीयू% एमईएम टाइम + कमांड' की तरह sth मिलता है। कोई भी सुझाव आवश्यक आउटपुट कैसे प्राप्त करें? – niko
रूप suggeseted, जाने का रास्ता valgrind है। यह एक प्रोफाइलर है जो स्मृति के उपयोग सहित आपके एप्लिकेशन के चल रहे प्रदर्शन के कई पहलुओं की जांच करता है।
वेलग्रिंड के माध्यम से अपने आवेदन चल रहा है आप malloc साथ आबंटित स्मृति जारी करने के लिए, आप एक ही स्मृति मुक्त करता है, तो मत भूलना अगर आप की पुष्टि कर सकेगा दो बार आदि
वह एक निश्चित कार्यक्रम की मेमोरी लीक का पता लगाने के बारे में नहीं पूछ रहा था। लेकिन कैसे पहचानें, प्रक्रियाओं में से कौन सी प्रक्रिया लीक थी। – akauppi
इसके अलावा शीर्ष करने के लिए आपको सिस्टम मॉनिटर (सिस्टम का उपयोग कर सकते हैं - प्रशासन - सिस्टम मॉनिटर, फिर प्रक्रिया टैब का चयन करें)। दृश्य का चयन करें - सभी प्रक्रियाएं, संपादन - प्राथमिकताएं पर जाएं और वर्चुअल मेमोरी कॉलम सक्षम करें। या तो इस कॉलम द्वारा या मेमोरी कॉलम
गनोम निश्चित रूप से यह एक है! – thanikkal
द्वारा सॉर्ट करें यदि कार्यक्रम लंबे समय तक लीक हो, तो शीर्ष व्यावहारिक नहीं हो सकता है। मैं एक साधारण शैल स्क्रिप्ट लिखूंगा जो प्रत्येक एक्स सेकंड में "ps aux" के परिणाम को जोड़ती है, इस पर निर्भर करता है कि स्मृति की महत्वपूर्ण मात्रा को रिसाव करने में कितना समय लगता है। की तरह कुछ:
while true
do
echo "---------------------------------" >> /tmp/mem_usage
date >> /tmp/mem_usage
ps aux >> /tmp/mem_usage
sleep 60
done
आप इसे deductively ऐसा नहीं कर सकते हैं, तो सिग्नल भड़कना पैटर्न डिबगिंग पर विचार करें: दस का एक पहलू से एक प्रक्रिया द्वारा आबंटित स्मृति की मात्रा बढ़ाएं। फिर अपना प्रोग्राम चलाएं।
यदि लीक की गई स्मृति की मात्रा समान है, तो यह प्रक्रिया रिसाव का स्रोत नहीं थी; प्रक्रिया को पुनर्स्थापित करें और अगली प्रक्रिया में एक ही संशोधन करें।
जब आप जिम्मेदार प्रक्रिया को हिट करते हैं, तो आपको अपनी मेमोरी लीक कूद ("सिग्नल फ्लेयर") का आकार दिखाई देगा। आप इस प्रक्रिया के भीतर अलग-अलग बयानों के आवंटन आकार को चुनकर इसे और भी कम कर सकते हैं।
मैं शीर्ष पर बेहतर विकल्प के रूप में, htop के उपयोग का सुझाव देता हूं।
कोशिश करें [valgrind] (http://valgrind.org/) – nickleefly