Почему Perl не мусор собирает память, когда большой массив освобождается? - программирование

Почему Perl не мусор собирает память, когда большой массив освобождается?

Я знаю, что Perl использует сбор мусора на основе ссылок. Когда переменная выходит за пределы области действия, счетчик ссылок уменьшается и, если REFcount переходит в 0, память де-распределяется. Но когда я прослеживаю небольшой пример, который показан ниже, я не смог найти де-распределение событий.

print "start..";

memory usage at start state

sub func
{
    my $length = 8*1024*1024;
    my $array = [1..$length];

memory usage after allocation

}

func();

print "done..";

memory usage during garbage collection stage

В примере, когда программа запускается, Perl.exe занимает ~ 3 МБ физической памяти. После выделения во время вызова func() Perl.exe занимает ~ 370 МБ памяти. Но после вызова func() выделенная память должна быть собрана мусором. почему это не сделано?

Ждем ваших ответов.

4b9b3361

Ответ 1

В соответствии с вопросом " Как я могу освободить массив или хэш, чтобы моя программа сжималась?" в perlfaq3:

Обычно вы не можете. Память, выделенная для лексических (т.е. my() переменных) не могут быть восстановлены или повторно использованы, даже если они выходят за рамки. это зарезервированы в случае, если переменные возвращаются в область видимости. Выделенная память глобальные переменные могут быть повторно использованы (в рамках вашей программы), используя undef() и/или delete().

В большинстве операционных систем память, выделенная для программы, никогда не может быть возвращается в систему. Вот почему долговременные программы иногда перестраиваются, исполните себя. Некоторые операционные системы (в частности, системы, которые используют mmap (2) для выделения больших блоков памяти) может восстановить память, которая больше не используется, но в таких системах perl должен быть настроен и скомпилирован для использования OS malloc, а не perl.

В общем случае выделение и выделение памяти не является чем-то, что вы может или должно беспокоиться о многом в Perl.

См. также Как я могу сделать свою программу Perl меньше памяти?

Ответ 2

Perl может отметить память как освобожденную, но это не обязательно означает, что она была освобождена обратно в ОС. Ваша программа Perl может повторно использовать эту память. Повторите попытку func. Вы не должны видеть увеличение объема используемой памяти.

Вы можете установить переменную окружения PERL_DESTRUCT_LEVEL и посмотреть, не имеет значения, но я сомневаюсь.

Сбор мусора не является одним из самых сильных сторон Perl.