Наиболее распространенная причина утечки памяти в Perl - циклические ссылки.Простейшей формой было бы что-то вроде:
sub subRoutine {
my( $this, $that );
$this = \$that;
$that = \$this;
return $_[0];
}
Теперь, конечно, люди, которые читают, вероятно, говорят: «Зачем кому-то это делать?»И один, как правило, не будет.Но более сложные структуры данных могут содержать циклические ссылки довольно легко, и мы даже не моргнем на них.Рассмотрим двойные списки, где каждый узел ссылается на узел слева и справа от него.Важно не допустить, чтобы последняя явная ссылка на такой список вышла из области видимости, не нарушив предварительно циклические ссылки, содержащиеся в каждом из его узлов, иначе вы получите структуру, которая недоступна, но не может быть собрана сборщиком мусора, поскольку ссылкачисло для каждого узла никогда не падает до нуля.
За Отличное предложение Эрика Строма , модуль ядра Scalar::Util
имеет функцию под названием weaken
.Ссылка, которая была ослаблена, не будет содержать счетчик ссылок на сущность, на которую она ссылается.Это может быть полезно для предотвращения циркулярных ссылок.Другая стратегия заключается в реализации вашей структуры данных с круговой ссылкой в классе, где метод объекта явно нарушает циклическую ссылку.В любом случае, такие структуры данных требуют тщательной обработки.
Еще один источник проблем - плохо написанные XS-модули (ничего против авторов XS; просто очень сложно хорошо писать XS-модули).То, что происходит за закрытыми дверями модуля XS, может быть утечкой памяти.
Пока мы не увидим, что происходит внутри subRoutine
, мы можем только догадываться, действительно ли существует проблема, и каков источникпроблема может быть.