#python #garbage-collection #objgraph
#python #сборка мусора #objgraph
Вопрос:
Я планировал проверить, имеет ли мой код Python 3.6 какую-либо циклическую ссылку.
Учитывая объект, get_referrers https://docs.python.org/3/library/gc.html#gc.get_referrers возвращает все объекты, которые ссылаются на объект. Однако следующее возвращает []
[o for o in gc.get_objects() if not bool(gc.get_referrers(o))]
это означает, что у всех объектов есть хотя бы один реферер.
Я также нашел https://mg.pov.lt/objgraph/objgraph.html#objgraph.is_proper_module который использует модули в качестве корней.
[o for o in gc.get_objects() if objgraph.is_proper_module(o)]
хотя модули все еще могут ссылаться друг на друга… Это правильный способ найти корни?
Ответ №1:
Довольно легко иметь объект, отслеживаемый GC, без рефереров, известных GC. Например,
>>> gc.get_referrers([1, 2, 3])
[]
Рефереры не возвращены. GC не знает о ссылках в стеке значений фреймового объекта (за исключением фреймов приостановленных генераторов и сопрограмм), откуда берется ссылка на [1, 2, 3]
список.
Другие случаи включают объекты, единственные ссылки на которые находятся в глобальных или локальных переменных C.