start :', sys.getrefcount(one)! two = one! print 'Second reference :', sys.getrefcount(one)! del two! print 'After del :', sys.getrefcount(one) At start : 2! Second reference : 3! After del : 2
In [15]: print('obj:', obj) obj: <__main__.ExpensiveObject object at 0x108ea24d0> In [16]: print('ref:', r) ref: <weakref at 0x108eb62b8; to 'ExpensiveObject' at 0x108ea24d0> In [17]: print('r():', r()) r(): <__main__.ExpensiveObject object at 0x108ea24d0> In [18]: del obj Deleting Expencive object In [19]: print('r():', r()) r(): None
превышает количество удаленных на х (по умолчанию 700, 10, 10) • Либо вручную gc.collect()! • Low memory, idle не инициируют сборку мусора • Может работать долго
2 • Новые объекты попадают в 0 (не все) • Сборка мусора работает по поколениям • Объекты пережившие сборку мусора переносятся в поколение +1 • Поколение 1 проверяется после threshold1 обработок поколения 0
и sys.last_traceback (их нужно явно занулить) • Исключения в __del__ игнорируются с выводом сообщения на stderr • Не вызывается при завершении программы
сборку мусора (вернет количество удаленных объектов • В gc.garbage список объектов с циклическими ссылками и __del__. Проходим по этому списку и разрываем циклические ссылки. (gc.get_referrers) • del gc.garbage[:]