CPython использует два механизма для очистки мусора.Одним из них является подсчет ссылок, который влияет на все объекты, но который не может очистить объекты, которые (прямо или косвенно) ссылаются друг на друга.Вот тут и начинается сборщик мусора: в python есть модуль gc
, который ищет циклические ссылки в объектах, о которых он знает.Только объекты, которые потенциально могут быть частью опорного цикла нужно беспокоиться об участии в циклическом дс.Так, например, списки делают, а строки нет;Строки не ссылаются ни на какие другие объекты.(На самом деле, история немного сложнее, поскольку есть два способа участия в циклическом gc, но это не очень важно здесь.)
Все классы Python (и их экземпляры) автоматически отслеживаютсяциклический gc.Типы, определенные в C, не являются, если они не прикладывают немного усилий.Все встроенные типы, которые могут быть частью цикла, делают.Но это означает, что модуль gc
знает только о типах, которые работают вместе.
Помимо механизма сбора, есть также тот факт, что Python имеет свой собственный агрегатор памяти агрегирования (obmalloc), который выделяет целые области памятии использует память для большинства меньших объектов, которые он создает.Python теперь освобождает эти арены, когда они полностью пусты (в течение долгого времени этого не было), но на самом деле опорожнение арены довольно редко: поскольку объекты CPython не могут быть перемещены, вы не можете просто переместить некоторые отставшие в другуюарена.