LINUX.ORG.RU

Высвобождение памяти (free) - когда НЕ происходит?

 


0

3

Читал я как-то на заборе, что 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 на структурах данных в примерах, аналогичных моему тесту?

Спасибо!

★★★★★

может не вполне очевидным образом забрать память и не отдать её системе

Кольцевые ссылки, например.

DELIRIUM ☆☆☆☆☆
()

Не отдаёт:

% perl -wE 'my$a=1x2**27;undef $a;system qq#grep RSS /proc/$$/status#;'
VmRSS:    135276 kB
ЕМНИП, я как-то добивался возвращения памяти с undef

disarmer ★★★
()
Ответ на: комментарий от disarmer

Если perl сожрал память, то в систему он её не вертает, а использует дальше повторно, пока не завершится процесс. Ня :)

animechaos
()
Ответ на: комментарий от disarmer

Хотя нет, всё правильно помню, без undef в два раза больше памяти:

% perl -wE 'my$a=1x2**27;system qq#grep RSS /proc/$$/status#;'
VmRSS:    266296 kB
И это именно undef, простая перезапись переменной такого эффекта не даёт.

Почему освобождает только половину сходу не скажу

disarmer ★★★
()
Ответ на: комментарий от disarmer

Осознал. В предыдущем коде 1x2**27 копируется в переменную, но и остаётся отдельным скаляром в памяти и undef к нему не приходит. Потому и памяти дважды больше чем 2**27 байт используется.

Вот так работает:

% perl -wE 'my$a;for(1..2**17){$a.=1x1024};system qq#grep RSS /proc/$$/status#;undef $a;system qq#grep RSS /proc/$$/status#'
VmRSS:    135188 kB                                                                                                                                                                           
VmRSS:      4324 kB

disarmer ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.