В отличие от Java, Perl использует подсчет ссылок для сборки "мусора". Я попытался искать некоторые предыдущие вопросы, которые говорят о C++ RAII и интеллектуальные указатели и Java GC, но не поняли, как Perl имеет дело с круговой проблемой ссылки.
Кто-либо может объяснить, как сборщик "мусора" Perl имеет дело с циклическими ссылками? Там какой-либо путь состоит в том, чтобы исправить память проспекта, на которую ссылаются, которые больше не используются программой, или Perl просто игнорирует эту проблему в целом?
Согласно моей копии Programming Perl 3rd ed. , на выходе Perl 5 делает «дорогую отметку и зачистку», чтобы восстановить круговые ссылки. Вы должны избегать циклических ссылок, насколько это возможно, потому что в противном случае они не будут восстановлены до тех пор, пока программа не выйдет из нее.
Perl 5 предлагает слабые ссылки через модуль Scalar::Utils.
Perl 6 перейдет на подключаемую схему сбора мусора (ну,базовая виртуальная машина будет иметь несколько параметров сборки мусора, и поведение этих параметров может повлиять на Perl). То есть вы сможете выбирать между различными сборщиками мусора, либо реализовывать свои собственные. Хотите коллекционер копий? Уверенный. Хотите коллекционера раскрасок? Молодец. Маркировка/развертка, уплотнение и т.д.? Почему бы нет?
Perl применяет альтернативный GC с меткой и очисткой в некоторых случаях (когда поток умирает, я думаю), чтобы восстановить циклические ссылки. Обратите внимание, что раздел Perl «каждое значение - строка» затрудняет создание истинных циклических ссылок; это возможно, но «нормальный» код Perl - нет, поэтому подсчет ссылок хорошо работает с Perl.