забейте :)
Misha v.3 06.11.2010 01:21
т.к. это не принципиальные мелочи, которые тем не менее _иногда_ позволяют освободить чуть больше памяти (очень приблизительное объяснение: переменная A ссылалась на переменную B, которая попадает под "очистку". во время первого compact значение переменной A не может быть "очищено" из-за этой ссылки, но после его выполнения эта пропадает, и второй compact может "собрать" и эту память).
памяти действительно освобождается лишь немногим больше, т.к. объяснение очень-очень приблизительное и используемая библиотека в большинстве случаев сама прекрасно обнаруживает и решает описанные сценарии. не может она разобраться только с циклическими ссылками, и в этом случае помогает использование нескольких compact подряд, но "при нормальных условиях" циклических ссылок в коде присутствует совсем немного.
рекомендую вообще забыть про compact, т.к. он довольно медленный, и вспоминать про него только при получении ошибок о нехватке памяти в очень узких местах, таких как обработка большого количества данных в больших циклах, перед transform и после работы с _файлами_ (загрузили, закодировали, сохранили, память больше не нужна и её можно собрать).
но чтобы compact нормально работал нужно обязательно использовать локальные переменные.