हाय मैं पर्ल वैरिएबल में बड़े स्ट्रिंग डेटा के साथ काम कर रहा हूं (इसका कच्चा ईमेल बॉडी, इसलिए इसमें संलग्नक हो सकते हैं)। पर्ल के सबस्ट्र के साथ दिलचस्प समस्या है। लगता है कि यह रिसाव है या मैं कुछ गलत कर रहा हूं (यदि हां, तो क्या?)। substr($str, 500);
आदेश परपर्ल सबस्ट्र मेमोरी लीक
#!/usr/local/bin/perl
use strict;
my $str = 'a'x10_000_000;
system("ps up $$"); #22mb used (why?)
#USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
#alt 64398 0,0 0,2 33292 22700 7 S+J 22:41 0:00,03 /usr/local/bin/perl ./t.pl
substr($str, 0, 1)='';
system("ps up $$"); #No leak
#USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
#alt 64398 0,0 0,2 33292 22732 7 S+J 22:41 0:00,04 /usr/local/bin/perl ./t.pl
substr($str, 500);
system("ps up $$"); #Leaked 10Mb (why?!)
#USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
#alt 64398 0,0 0,3 43532 32520 7 S+J 22:41 0:00,05 /usr/local/bin/perl ./t.pl
my $a = substr($str, 500);
system("ps up $$"); #Leaked 10Mb + Copyed 10Mb
#USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
#alt 64398 0,0 0,5 64012 52096 7 S+J 22:41 0:00,09 /usr/local/bin/perl ./t.pl
undef $a; #Free scalar's memory
system("ps up $$"); #Free'd 10Mb
#USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
#alt 64398 0,0 0,4 53772 42308 7 S+J 22:41 0:00,09 /usr/local/bin/perl ./t.pl
# Total leaked 2 times for 10Mb each
लें देखो: कोड पर विचार करें। इसके अलावा स्ट्रिंग की इसकी प्रतिलिपि (यह ठीक है), यह समान मात्रा में स्मृति को लीक करती है, इसलिए यदि आप रिटर्न वैल्यू का उपयोग दो बार स्मृति के टुकड़े करते हैं, जिसमें से एक पूरे समय स्क्रिप्ट के लिए खो जाता है ... इसके अलावा, ऐसा लगता है कि यह कोई भी नहीं है "आंतरिक बफर" की तरह है, क्योंकि यह लीक प्रत्येक कॉल ..
नोट 10 एमबी वृद्धि की यह स्थिति नहीं "फिर से उपयोगी" स्मृति के बाद से आगामी कॉल अधिक से अधिक स्मृति प्राप्त .. है
कोई सुझाव कैसे ठीक करने या उससे बचने के लिए?
मेरा पर्ल संस्करण 5.14.2; मेरे काम पर मुझे वही व्यवहार मिला (5.8.8)
दिलचस्प, रिसाव पर्ल v5.12.4 और v5.14.2, लेकिन v5.16.2 नहीं होता है। – creaktive
संस्करण – PSIAlt
के बारे में अपडेट किया गया सबसे अच्छा हिस्सा: v5.16.2 पर भी, 'undef' स्मृति को अस्वीकार नहीं करता है! – creaktive