嗨,我正在使用 Perl 变量中的大字符串数据(它的原始电子邮件正文,因此它可以包含附件)。Perl 的substr有一个有趣的问题。似乎它的泄漏或我做错了什么(如果是,是什么?)。考虑代码:
#!/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
看substr($str, 500);
命令。除了它的字符串的返回副本(没关系),它会泄漏相同数量的内存,所以如果你使用返回值它的两次内存,其中一个在整个时间脚本工作时丢失......另外,它似乎不是任何一种“内部缓冲区”,因为它会泄漏每个调用..
请注意,这种增加 10Mb 的情况不是“重用”内存,因为后续调用会获得越来越多的内存。
有什么建议可以解决或避免这种情况吗?
我的 Perl 版本 5.14.2;我在工作中遇到的相同行为(5.8.8)