यह प्रासंगिक हो सकता है कि पर्ल कभी मेमोरी को सिस्टम में वापस देता है: यह 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 आपको उस कोड की मात्रा को कम करने में मदद कर सकता है, जिसे आप खोजना चाहते हैं, लेकिन यह विंडोज पर काम नहीं करेगा, इसलिए आपको ऐसा करने के लिए लिनक्स को पोर्ट (कम से कम रिसाव भाग) करना होगा।
http://search.cpan.org/perldoc?Scalar:: 'कमजोर' –
'कमजोर' आपकी मदद कैसे करता है? – geocar
@geocar, यह शानदार है! मुझे पता है कि जटिल perl कार्यक्रमों में स्मृति रिसाव की अपरिहार्य समस्या के लिए एकमात्र मजबूत विधि। –