python GC - подсчет ссылок работает только КОГДА gc.collect ()? - PullRequest
0 голосов
/ 18 сентября 2018

Я понимаю, что Python GC работает двумя способами:
1) Основной счетчик ссылок - ниже «Джон» имеет счетчик нулей, когда «имя» установлено в «Том»

name = "John"
name = "Tom" (Reference count zero for "John")

2) Обнаружение циркулярных ссылок (Острова Изоляции). «GC» работает в недетерминированное время (или если вы вызываете gc.collect (), что не рекомендуется).

Теперь, мой вопрос, для (1), когда имя установлено в "Том", "Джон" не собирается немедленно , как только имя = "Том", верно? GC просто пометит «Джона» как не поддающийся повторной проверке и, таким образом, готовый для сбора (что произойдет позже ).
Мое понимание верно? Спасибо

Справка:
https://rushter.com/blog/python-garbage-collector/ https://pythoninternal.wordpress.com/2014/08/04/the-garbage-collector/

1 Ответ

0 голосов
/ 18 сентября 2018

Закрыть, но ключевая деталь отключена: когда счетчик ссылок падает до 0 в CPython, тогда объект без ссылок получает немедленно собранный. Это не имеет ничего общего с циклической системой ГХ. Действительно, вы можете сделать gc.disable(), чтобы полностью отключить циклическую систему ГХ, и подсчет ссылок продолжит собирать нециклический мусор сам по себе.

Вы можете увидеть это сами, например,

import gc
gc.disable()
i = 1
while True:
    xs = [i]
    i += 1

Это работает вечно, но использование памяти останется стабильным. Это потому, что подсчет ссылок сам по себе перезаписывает память для целого числа и списка, созданного на каждой итерации.

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