Читал я как-то на заборе, что perl якобы единожды выделенную ему память обратно системе старается не возвращать, а прямо-таки держит до последнего.
Ну написал простенький тест:
#!/usr/bin/perl
use MIME::Base64 qw(encode_base64);
use Time::HiRes qw(sleep);
open my $fh, '<', '/dev/urandom';
my $N=shift or die 'FYAH';
sub fillHash {
my ($N,$hsh,$fh)=@_;
my $randBase=$N*10;
for (1..$N) {
read $fh, $s, 1024;
$hsh->{int(rand $randBase)}=encode_base64($s);
}
}
my %H;
while (1) {
fillHash($N,\%H,$fh);
sleep 0.2;
%H=();
}
В итоге, что и логично было бы предположить, потребление памяти не меняется со временем.
Но всё же... в каких ситуациях Perl и в самом деле может не вполне очевидным образом забрать память и не отдать её системе? Скажем так, насколько лениво Perl делает free на структурах данных в примерах, аналогичных моему тесту?
Спасибо!