दिलचस्प पोस्ट
माउस कर्सर को सी # का उपयोग कैसे करें? फोनगैप – लैंडस्केप अभिविन्यास को मजबूर करना ऑफ़लाइन विकास के लिए मैवेन कॉन्फ़िगर कैसे करूं? रैंड फ़ंक्शन का इस्तेमाल कैसे करें, जो किसी विशेष श्रेणी में नंबर बना सकते हैं? 1 या 0 की लगातार बिट स्ट्रिंग ढूंढना फ्लास्क ढांचे में सर्वर पुश को कैसे कार्यान्वित करें? जावास्क्रिप्ट में प्रॉपर्टी और विधि नामों के लिए अंडरस्कोर प्रीफ़िक्स एक नई एंड्रॉइड सूचना का पता लगाएं कैसे मेवेन प्लगइन निष्पादन को कमांड लाइन से सीधे निष्पादित करें? सीएसएस का इस्तेमाल करते हुए माता-पिता डीआईवी की तुलना में बाल DIV की चौड़ाई व्यापक बनाने का तरीका क्या है? एएसपी। नेट (ओविन) पहचान: वेबआईडी नियंत्रक से यूजरआईडी कैसे प्राप्त करें? टेम्पलेट फ़ंक्शन के लिए अपरिभाषित संदर्भ सीएसएस में html (lang = "en") और html: lang (en) के बीच अंतर क्या है? HttpWebRequest कनेक्शन टाइमआउट को सी # में समायोजित करना JSF पृष्ठों को .jsp या .xhtml या .jsf एक्सटेंशन के साथ बनाने में क्या अंतर है I

पर्ल मेमोरी यूज प्रोफाइलिंग और लीक डिटेक्शन?

मैंने पर्ल में एक सतत नेटवर्क सेवा लिखा है जो लिनक्स पर चलता है।

दुर्भाग्य से, जैसा कि यह चलता है, इसका निवासी ढेर आकार (आरएसएस) बढ़ता है, और बढ़ता है, और धीरे-धीरे, निश्चित रूप से बढ़ता है।

यह मेरे भाग में सभी अनावश्यक हैश कुंजियों को तोड़ने और वस्तुओं के सभी संदर्भों को हटा देने के लिए मेहनती प्रयासों के बावजूद है, अन्यथा संदर्भ मायने रखता है और गारबेज संग्रह में बाधा डालता है।

क्या कोई पर्ल कार्यक्रम के भीतर विभिन्न देशी डेटा पुरालेख, धन्य हैश संदर्भ ऑब्जेक्ट इत्यादि से जुड़े स्मृति उपयोग को परिभाषित करने के लिए कोई अच्छा उपकरण है? स्मृति लीक को ट्रैक करने के लिए आप क्या उपयोग करते हैं?

मैं Perl debugger या किसी भी विभिन्न इंटरैक्टिव प्रोफेयरों में समय व्यतीत नहीं करता, इसलिए एक गर्म, कोमल, गैर-गूढ़ प्रतिक्रिया की सराहना की जाएगी। 🙂

वेब के समाधान से एकत्रित समाधान "पर्ल मेमोरी यूज प्रोफाइलिंग और लीक डिटेक्शन?"

आपके ऑब्जेक्ट में से किसी एक में आपका एक परिपत्र संदर्भ हो सकता है जब कचरा कलेक्टर इस वस्तु को निषेध करने के साथ आता है, तो परिपत्र संदर्भ का अर्थ है कि उस संदर्भ से संदर्भित सभी चीजें कभी भी मुक्त नहीं हो जाएंगी। आप डेवेल :: चक्र और टेस्ट :: मेमोरी :: साइकिल के साथ परिपत्र संदर्भों की जांच कर सकते हैं कोशिश करने के लिए एक बात (हालांकि यह उत्पादन कोड में महंगा हो सकता है, इसलिए जब एक डिबग फ्लैग सेट नहीं होता है तो मैं इसे अक्षम करता हूँ) आपके सभी वस्तुओं के लिए डिस्ट्रिक्ट के अंदर परिपत्र संदर्भों की जांच कर रहा है:

# make this be the parent class for all objects you want to check; # or alternatively, stuff this into the UNIVERSAL class's destructor package My::Parent; use strict; use warnings; use Devel::Cycle; # exports find_cycle() by default sub DESTROY { my $this = shift; # callback will be called for every cycle found find_cycle($this, sub { my $path = shift; foreach (@$path) { my ($type,$index,$ref,$value) = @$_; print STDERR "Circular reference found while destroying object of type " . ref($this) . "! reftype: $type\n"; # print other diagnostics if needed; see docs for find_cycle() } }); # perhaps add code to weaken any circular references found, # so that destructor can Do The Right Thing } 

आप स्मृति लीक की खोज के लिए डेवल :: लीक का उपयोग कर सकते हैं। हालांकि, प्रलेखन काफी विरल है … उदाहरण के लिए, केवल एक को $ Devel::Leak::NoteSV() पास करने के लिए संदर्भ संभाल कैसे मिलता है? च मुझे जवाब मिल गया, मैं इस प्रतिक्रिया को संपादित करेंगे

ठीक है, यह पता चला है कि इस मॉड्यूल का उपयोग करना बहुत सीधा है ( अपाचे :: लीक से कोड चुरा लिया गया है):

 use Devel::Leak; my $handle; # apparently this doesn't need to be anything at all my $leaveCount = 0; my $enterCount = Devel::Leak::NoteSV($handle); print STDERR "ENTER: $enterCount SVs\n"; # ... code that may leak $leaveCount = Devel::Leak::CheckSV($handle); print STDERR "\nLEAVE: $leaveCount SVs\n"; 

मैं बीच खंड में जितना संभव हो सके उतना कोड रखता हूं, छुट्टी के साथ की गई गणना निष्पादन की समाप्ति के करीब (यदि आपके पास हो) संभव है – अधिकतर चर को संभव के रूप में वितरित किए जाने के बाद (यदि आपको नहीं मिल सकता है गुंजाइश के बाहर एक चर, आप इसे करने के लिए इशारा करते हुए मुक्त करने के लिए इसे undef निर्दिष्ट कर सकते हैं)।

आगे की कोशिश करने के लिए (यकीन नहीं है कि अगर एलेक्स के प्रश्न के बाद टिप्पणी में यह सबसे अच्छा होगा): मैं अगले (डेवेल :: लीक के अलावा) की कोशिश करूँगा:

अपने कार्यक्रम के "अनावश्यक" भागों को समाप्त करने की कोशिश करें, या इसे अलग-अलग निष्पादनयोग्य में विभाजित करें (वे संचार करने के लिए सिग्नल का इस्तेमाल कर सकते हैं, या कमांड लाइन तर्कों के साथ एक-दूसरे को कॉल कर सकते हैं) – लक्ष्य को एक निष्पादन योग्य को छोटी मात्रा में उबाल करना है कोड का जो अभी भी खराब व्यवहार दर्शाता है यदि आपको यकीन है कि यह आपका कोड नहीं है, तो आप उपयोग कर रहे बाहरी मॉड्यूल की संख्या को कम कर सकते हैं, खासकर उन लोगों के पास जिनके पास XS कार्यान्वयन है यदि यह आपका स्वयं का कोड है, तो संभवतः गड़बड़ कुछ देखें:

  • निश्चित रूप से इनलाइन :: सी या एक्सएस कोड का कोई भी उपयोग
  • संदर्भों का सीधा उपयोग, जैसे \@list या \%hash , जैसे कि \@list संदर्भों की तरह [qw (foo bar)] (पहले एक अन्य संदर्भ बनाता है जो खो सकता है; बाद में, केवल चिंता का एक संदर्भ है, जो आमतौर पर एक स्थानीय लैक्सिकल स्केलर में संग्रहीत होता है
  • वेरिएबल को अप्रत्यक्ष रूप से जोड़ना, जैसे $$foo जहां $foo संशोधित किया जाता है, जो चर के ऑटोववियक्शन का कारण बन सकता है (यद्यपि आपको strict 'refs' चेकिंग अक्षम करने की आवश्यकता है)

इसके बारे में एक अच्छा गाइड पर्ल मैनुअल में शामिल है: Perl स्मृति उपयोग डीबगिंग

मैंने हाल ही में एक बड़े पर्ल एप्लिकेशन के लिए एक प्रोफाइलर के रूप में NYTProf का उपयोग किया है यह मेमोरी उपयोग को ट्रैक नहीं करता है, लेकिन यह सभी क्रियान्वित कोड पथ का पता लगाता है जो पता लगाता है कि लीक कहाँ से उत्पन्न होता है। यदि आप लीक कर रहे हैं तो डाटाबेस कनेक्शंस जैसे दुर्लभ संसाधन हैं, जहां वे आवंटित किए गए हैं और बंद हैं, लीक की तलाश में लंबा रास्ता तय किया जाता है।