Почему эта утечка? - PullRequest
       9

Почему эта утечка?

3 голосов
/ 17 ноября 2008

Почему эта утечка в Perl?

$ perl -MDevel::LeakTrace::Fast -e 'our @a=(1);our @b=(1)'
leaked SV(0x0x84e053c) from -e line 1

$ perl -v
This is perl, v5.8.0 built for i386-linux-thread-multi
[...]

$ uname -a
Linux ant1 2.4.21-20.ELsmp #1 SMP Wed Aug 18 20:46:40 EDT 2004 i686 i686 i386 GNU/Linux   

Спасибо! * * 1004

1 Ответ

10 голосов
/ 17 ноября 2008

Это не так. Поместите его в цикл и убедитесь сами: память процесса не увеличивается с каждой итерацией цикла.

for(1 .. 10_000_000)
{
  our @a = (1);
  our @b = (1);
}

Все, что "утечка" сообщения (вероятно) говорит вам, что программа закрылась с выдающимися переменными. Чтобы заставить замолчать это сообщение, неопределите переменные до конца программы:

perl -MDevel::LeakTrace::Fast -e 'our @a = (1); our @b = (1); undef @a; undef @b;'

FWIW, то же сообщение напечатано в perl 5.10.0, поэтому я не уверен, что обновление perl - это ответ.

Что касается того, почему сообщение появляется в некоторых случаях, но не в других, это, вероятно, каприз Devel :: LeakTrace :: Fast. Многие модули обнаружения утечек в Perl имеют «идиосинкразию» (мягко говоря), как это.

Итог: единственный 100% надежный способ проверить утечку - это увидеть, увеличивается ли использование памяти при повторном выполнении кода, о котором идет речь. Если вы сомневаетесь, вернитесь к этому.

Однако могут помочь различные модули Devel :: *. Но сначала лучше изолировать код утечки: отключите половину кода и посмотрите, сохраняется ли утечка. Теперь вы сузили свой поиск вдвое. Повторите это несколько раз, и вы быстро перейдете к функции или оператору, которые дают утечку. Затем посмотрите, не утек ли этот код, если поместить его в отдельный скрипт. Наконец, чтобы понять, почему происходит утечка, используйте модули Devel :: (например, проверка циклов памяти с помощью Devel :: Cycle ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...