Hi ich arbeite mit großen String-Daten in Perl-Variable (seine Roh-E-Mail-Körper, so dass es Anhänge enthalten kann). Interessantes Problem mit Perls substr. Scheint sein Leck oder etwas falsch zu machen (wenn ja, was?). Code beachten:Perl substr Speicherleck
#!/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
Betrachten Sie substr($str, 500);
Befehl. Zusätzlich die Kopie der Zeichenfolge zurück (das ist in Ordnung), es leckt die gleiche Menge an Speicher, so dass, wenn Sie Rückgabewert seine doppelte Stück Speicher, von denen eine für die ganze Zeit Skript funktioniert verloren ist ... Auch scheint es nicht irgendwelche Art „interne Puffer“, da es jeden Anruf ..
Hinweis: dieser Fall von 10Mb Anstieg Lecks ist nicht „Wieder nützlich“ Speicher da nachfolgende Anrufe mehr und mehr Speicher erhalten ..
Irgendwelche Vorschläge, wie um das zu beheben oder zu vermeiden?
Meine Perl-Version 5.14.2; Gleiches Verhalten, das ich auf meine Arbeit bekam (5.8.8)
Interessant, scheint das Leck zu Perl v5.12.4 & v5.14.2 passieren, aber nicht v5.16.2. – creaktive
Aktualisiert über die Version – PSIAlt
Der beste Teil: selbst auf v5.16.2, 'undef' scheint nicht den Speicher freizugeben! – creaktive