Все объекты Python отслеживаются сборщиком мусора? - PullRequest
3 голосов
/ 02 ноября 2010

Я пытаюсь отладить утечку памяти (см. Вопрос Утечка памяти в Python Twisted: где это? ).

Когда работает сборщик мусора, имеет ли он доступ?ко всем объектам Python, созданным интерпретатором Python?Если мы предположим, что библиотеки Python C не просочились, должно ли использование памяти RSS расти линейно по отношению к количеству объектов GC?А как насчет sys.getobjects?

Ответы [ 2 ]

9 голосов
/ 02 ноября 2010

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

Все классы Python (и их экземпляры) автоматически отслеживаютсяциклический gc.Типы, определенные в C, не являются, если они не прикладывают немного усилий.Все встроенные типы, которые могут быть частью цикла, делают.Но это означает, что модуль gc знает только о типах, которые работают вместе.

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

0 голосов
/ 02 ноября 2010

RSS не растет линейно с количеством объектов Python, потому что объекты Python могут различаться по размеру. Объект int обычно намного меньше, чем большой list.

Полагаю, вы имели в виду gc.get_objects, когда писали sys.getobjects. Эта функция дает вам список всех достижимых объектов. Если вы предполагаете утечку, вы можете повторить этот список и попытаться найти объекты, которые уже должны были быть освобождены. (Например, вы можете знать, что все объекты определенного типа должны быть освобождены в определенный момент.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...