Как работает сборщик мусора (Garbage Collector) в PHP? Когда имеет смысл вручную вызвать сборщик мусора?
Уровень: Senior
Ответ
Garbage Collector (GC) в PHP отвечает за обнаружение и устранение "циклических" ссылок — ситуаций, когда объекты ссылаются друг на друга, и поэтому счётчик ссылок не падает до нуля, хотя они более недостижимы. В PHP используется комбинация: счётчик ссылок освобождает память для всех "простых" случаев, а GC периодически проверяет циклы. Начиная с PHP 5.3 GC работает автоматически: по достижении определённого количества аллокаций он запускает цикл сбора: сканирует граф объектов, выявляет изолированные циклы, и освобождает их. Обычно программисту не нужно явно вмешиваться. Функция gc_collect_cycles() вручную запускает сборщик циклов. Имеет смысл вызывать GC вручную в редких случаях — например, внутри длинного скрипта после большого количества операций, если известно, что накопились циклические ссылки и они занимают много памяти, а ждать автоматического срабатывания не хочется. Но чрезмерно вызывать gc_collect_cycles() не стоит — это затратная операция, она сама потребляет CPU. Обычно необходимость ручного вызова связана с нестандартными случаями (например, при интенсивном создании объектов с взаимными ссылками в больших количествах).