2009-01-09 9 views
34

पर्ल जीसी के लिए संदर्भ गिनती का उपयोग करता है, और दुर्घटना से परिपत्र संदर्भ बनाना काफी आसान है। मुझे लगता है कि मेरा प्रोग्राम अधिक से अधिक स्मृति का उपयोग कर रहा है, और यह शायद कुछ दिनों के बाद बह जाएगा।मुझे लंबे समय से चलने वाले पर्ल कार्यक्रम में मेमोरी लीक कैसे मिल सकता है?

क्या पर्ल में मेमोरी लीक डीबग करने का कोई तरीका है? एक कार्यक्रम से जुड़ना और विभिन्न प्रकार की वस्तुओं की संख्या प्राप्त करना एक अच्छी शुरुआत होगी। अगर मुझे पता था कि कौन से ऑब्जेक्ट्स अपेक्षा से अधिक असंख्य हैं तो मैं उन सभी संदर्भों की जांच कर सकता हूं और उम्मीद है कि रिसाव को ठीक कर दें।

उत्तर

34

यह प्रासंगिक हो सकता है कि पर्ल कभी मेमोरी को सिस्टम में वापस देता है: यह malloc() और उसके साथ जुड़े सभी नियमों तक है।

को जानने का malloc() कैसे आवंटित स्मृति अधिक से अधिक सवाल का जवाब देने के लिए महत्वपूर्ण है, और यह व्यवस्था करने के लिए प्रणाली से भिन्न होता है, लेकिन सामान्य रूप में सबसे malloc() कार्यान्वयन आवंटन और ढेर की तरह आदेश में deallocating कार्यक्रमों के लिए अनुकूलित कर रहे हैं। पर्ल ट्रैकिंग मेमोरी के लिए रेफरेंस-गिनती का उपयोग करता है जिसका मतलब है कि डीलोकेशन का मतलब है (जीसी-आधारित भाषा के विपरीत जो malloc() नीचे उपयोग करता है) वास्तव में को बताएं कि जहां डेलोकेशन होने जा रहा है, और किस क्रम में।

हो सकता है कि आप undef($old_object) स्पष्ट रूप से फोन करके इस तथ्य का लाभ लेने के अपने कार्यक्रम पुनर्निर्माण कर सकते हैं - और सही क्रम में, एक तरह से जिस तरह से करने के लिए इसी में सी-प्रोग्रामर कहना free(old_object);

लंबे समय के लिए चल रहे कार्यक्रम (दिन, महीनों, आदि), जहां मेरे पास लोड/कॉपी/डंप चक्रों का भार है, मैं exit() and exec() का उपयोग करके कचरा इकट्ठा करता हूं, और जहां यह अन्यथा असुरक्षित है, मैं बस अपने डेटा संरचनाओं को पैक करता हूं (Storable का उपयोग करके) और फाइल डिस्क्रिप्टर ($^F का उपयोग करके) और exec($0) - आमतौर पर $ENV{EXEC_GC_MODE} जैसे पर्यावरण चर सेट के साथ, और आपको कुछ भी की आवश्यकता हो सकती है, भले ही आपके पास कोई भी न हो अपने की लीक बस इसलिए कि पर्ल छोटे टुकड़ों को लीक कर रहा है कि आपके सिस्टम की malloc() वापस नहीं दे सकती है।

बेशक, यदि आपके में कोड में लीक है, तो मेरी बाकी की सलाह कुछ और प्रासंगिक है। यह मूल रूप से to another question on this subject पोस्ट किया गया था, लेकिन यह स्पष्ट रूप से कवर लंबे समय तक चलने वाले प्रोग्राम नहीं था।


सभी पर्ल प्रोग्राम मेमोरी लीक या तो एक XS एक संदर्भ पकड़े, या एक परिपत्र डेटा संरचना हो जाएगा। Devel::Cycle परिपत्र संदर्भ खोजने के लिए एक शानदार उपकरण है, यदि आप जानते हैं कि संरचनाओं में लूप होने की संभावना है। Devel::Peek का उपयोग उच्च-अपेक्षाकृत संदर्भ गणना वाले ऑब्जेक्ट्स को खोजने के लिए किया जा सकता है।

यदि आपको नहीं पता कि और कहां देखना है, Devel::LeakTrace::Fast एक अच्छा पहला स्थान हो सकता है, लेकिन आपको डिबगिंग के लिए निर्मित एक पर्ल की आवश्यकता होगी।

यदि आपको संदेह है कि लीक एक्सएस-स्पेस के अंदर है, तो यह बहुत कठिन है, और Valgrind शायद आपकी सबसे अच्छी शर्त होगी। Test::Valgrind आपको उस कोड की मात्रा को कम करने में मदद कर सकता है, जिसे आप खोजना चाहते हैं, लेकिन यह विंडोज पर काम नहीं करेगा, इसलिए आपको ऐसा करने के लिए लिनक्स को पोर्ट (कम से कम रिसाव भाग) करना होगा।

+0

http://search.cpan.org/perldoc?Scalar:: 'कमजोर' –

+0

'कमजोर' आपकी मदद कैसे करता है? – geocar

+0

@geocar, यह शानदार है! मुझे पता है कि जटिल perl कार्यक्रमों में स्मृति रिसाव की अपरिहार्य समस्या के लिए एकमात्र मजबूत विधि। –

3

सीपीएन मॉड्यूल Devel::Cycle जैसा लगता है कि आप क्या देख रहे हैं। इसके लिए आपके कोड में कुछ बदलाव करने की आवश्यकता है, लेकिन इससे आपको बिना किसी समस्या के अपने संदर्भ ढूंढने में मदद करनी चाहिए।

2

valgrind एक महान लिनक्स एप्लिकेशन है, जो कोड चलाने में मेमोरी लीक का पता लगाता है। यदि आपका पर्ल कोड लिनक्स पर चलता है, तो आपको इसे देखना चाहिए।

+0

मुझे नहीं लगता कि यह काम करेगा। पर्ल एक व्याख्या की गई भाषा है। पर्ल दुभाषिया में केवल स्मृति आवंटन कॉल को इंगित नहीं करेंगे? – Ferruccio

+0

कोई वालग्रींड पर्ल के साथ काम नहीं कर सकता है, बस सही विकल्पों का उपयोग करें। यह दस्तावेज है। इसे संकलित निष्पादन योग्य को खुद को संलग्न करने की आवश्यकता नहीं है। – casey

+0

valgrind एक्सएस कोड में मेमोरी लीक मिलेगा, लेकिन पर्ल कोड में नहीं। इसके लिए डेवेल :: साइकिल या डेवेल :: लीक का उपयोग करें। – rjh

2

अन्य टिप्पणियों के अतिरिक्त, आप मेरे Perl Memory Use talk को LPW2013 पर उपयोगी पा सकते हैं। मैं the screencast देख के रूप में यह स्लाइड बताते हैं और कुछ प्यारा दृश्यों और अंत में कुछ प्रश्न & एक है की सलाह देते हैं।

मैं भी पॉल इवांस Devel::MAT मॉड्यूल जो मैं बात में उल्लेख को देख सुझाव देना चाहेंगे।

संबंधित मुद्दे