Как отключить сборщик мусора perl? - PullRequest
2 голосов
/ 04 марта 2020

У меня есть недолговечный (быстрый для выполнения) сценарий perl, который, тем не менее, использует достаточно памяти для запуска сборщика мусора. В свою очередь, сбор занимает больше, чем остальная часть обработки.

Есть ли способ отключить сборку мусора и позволить ОС сделать это при выходе из сценария?

Редактировать G C останавливает сценарий в середине, а не в самом конце. KILL это не помогает.

Ответы [ 2 ]

6 голосов
/ 04 марта 2020

Два подхода к быстрому выходу из вашей программы без выполнения глобального уничтожения:

  1. POSIX::_exit

Это идентично C функция _exit(). Он немедленно выходит из программы, что означает, помимо прочего, что буферизованный ввод / вывод не очищен.

kill ваш основной процесс с SIGKILL.

kill 'KILL', $$;
5 голосов
/ 05 марта 2020

Как упоминалось в комментариях, сборка мусора в Perl является механизмом пересчета и запускается значением, на которое больше не ссылается что-либо (независимо от того, хранится ли переменная, в которой go может выходить из области видимости или быть назначенной). другое значение, операция, частью которой он является, стек вызовов подпрограммы, в который он передается, или фактическая ссылка ).

Таким образом, чтобы предотвратить очистку значения до завершения программы самый простой способ - сделать противоположность общепринятому пониманию памяти: ссылаться на значение из глобальной системы sh.

our $foo = \$something_to_keep_alive;

В качестве альтернативы, вы можете (ab) использовать тот факт, что циклические ссылки будет препятствовать уменьшению счетчиков ссылок до глобального уничтожения.

$something->{self} = $something;

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

...