механизм сбора мусораЭто должен быть самый часто задаваемый вопрос на собеседовании, так как же решается механизм сборки мусора (Garbage Collection) в Python? Я помню, что в каждой вводной книге по Python будет сказано, что в Python, пожалуйста.Не беспокойтесь об утечках памяти, то какой принцип за этим стоит, приезжайте сегодня на 818.
Алгоритмы GC в Python
Разделено на следующие три пункта: подсчет ссылок / маркировка-очистка / переработка поколений.
Подсчет ссылок (первичный)
Когда вы впервые начнете изучать Python, кто-нибудь всегда скажет вам,все является объектомявляется главной особенностью. В основе каждого объекта в Python лежитСтруктураPyObject, который имеетсчетчик ссылок(ob_refcnt).
typedef struct_object {
int ob_refcnt;
struct_typeobject *ob_type;
} PyObject;
a=10
Счетчик ссылок означает, что на объект ссылается метод Новый, когда он падает на землю, когда он просто Новый (гугу — это не гуагуа), поэтому его счетчик ссылок равен 1, если на него ссылаются (то есть на основе предыдущий пример, такой как :b=a, добавление в список функций и т. д., добавляет 1 к счетчику ссылок), если объект, ссылающийся на него, удален (DEL b на основе предыдущего), то его счетчик ссылок будет уменьшен на единицупока его счетчик ссылок не достигнет 0, механизм сбора мусора подойдёт к дверисделай это(Утилизация), решусь: я проверил счетчик воды, когда открыл дверь.
преимущество недостаток:
Поскольку подсчет ссылок является основным методом GC, давайте рассмотрим его преимущества и недостатки.
отлично:
Просто, в режиме реального времени (раз ноль, больше никаких ББ с собой, сделай это)
недостаток:
·Высокое обслуживание (простое и в реальном времени, но требует некоторых дополнительных ресурсов. Хотя логика проста, это хлопотно. Например, если вы едите клубнику, помойте руки один раз, вместо того, чтобы мыть руки после еды.)
·Не могу решить: ---> Циклическая ссылка (младшая):
a=[1,2]
b=[2,3]
a.append(b)
b.append(a)
DEL a
DEL b
Честно говоря, это все еще немного похоже на проблему взаимоблокировки.Такая проблема возникает в List Dict Object и т. д. в структуре, которая может быть зациклена.Вычтите 1 из каждого (так что их соответствующие счетчики ссылок по-прежнему равны 1), что смущает в это время, все 1 имеют золотую медаль без смерти (1 не будет меняться все время). Такая ситуация не может быть решена одним только подсчетом ссылок.Также представил следующую тему для нас mark-clear
Отметить-Очистить:Удаление меток используется для решения проблемы циклических ссылок.Только объекты-контейнеры будут иметь циклы ссылок, такие как списки, словари, классы и кортежи. Во-первых, чтобы отслеживать объекты-контейнеры, каждый объект-контейнер должен поддерживать два дополнительных указателя, Он используется для формирования связанного списка объектов-контейнеров, а указатели указывают на два объекта-контейнера до и после, что удобно для операций вставки и удаления. Только представьте, сейчас есть две ситуации:
А:
a=[1,3]
b=[2,4]
a.append(b)
b.append(a)
del a
del b
B:
a=[1,3]
b=[2,4]
a.append(b)
b.append(a)
del a
Хорошо, теперь давайте приступим к делу. В алгоритме пометки-зачистки есть два концлагеря, одинкорневой связанный список (корневой объект), другойнедостижимый связанный список.
·Для сценария A, когда оператор DEL не выполняется, счетчики ссылок a и b равны 2 (init+append=2), но после выполнения DEL счетчики ссылок a и b уменьшаются на 1. a, b попадают в круг круговых ссылок, а затем начинает работать алгоритм метки-развертки, находит один конец a, и начинает разбирать кольцо ссылок этой a, b (Мы начинаем с A, поскольку он имеет ссылку на B, уменьшаем счетчик ссылок B на 1; затем следуем по ссылке B, поскольку B имеет ссылку на A, также уменьшаем ссылку A на 1, так что завершенное удаление кольца между циклическими ссылками объекты.), после его удаления обнаруживается, что циклическая ссылка a и b стала равной 0, поэтому a и b обрабатываются вНедоступный список удаляется напрямую.
·Для сценария B просто посмотрите на счетчик ссылок после того, как b берет кольцо, но счетчик ссылок равен 0, когда a берет кольцо. В это время a попал в список недостижимых и был приговорен к смертной казни, но в это время в корневом списке есть b.Если свершится, какая справедливость в мире..., b в корневом связанном списке будет ссылаться при обнаружении ссылок, и если a будет удалено, то b будет...здорово, После первого испытания a был невиновен во втором испытании, поэтому он был перенесен в корневой список.
Контроль качества:Почему вы хотите сделать эти два связанных списка?
Причина разделения на два связанных списка основана на таком соображении:Текущий недостижимый может содержать объекты в корневом связанном списке, объекты, на которые прямо или косвенно ссылаются, эти объекты не могут быть переработаны, как только такой объект будет найден в процессе маркировки, он будет перемещен из недостижимого связанного списка в корневой связанный список. ; когда маркировка завершена, все оставшиеся объекты в недостижимом связанном списке являются настоящими объектами мусора, и следующая сборка мусора должна быть ограничена только недостижимым связанным списком.
Поколенческая переработка:
Чтобы понять классификацию и переработку, мы должны сначала понять,Порог GCТак называемое пороговое значение является критической точкой. Поскольку ваша программа работает, Python Transer, чтобы сохранить вновь созданные объекты, а также отслеживать, потому что ссылочный счетчик является нулевым освобожденным объектом. Теоретически, create == номер выпуска должен быть таким. Но если есть круговая ссылка, она, безусловно, создает> количество, выпущенное количество, когда разница между количеством создания ряд выпуска достигает заранее определенного порогового значения, механизм сбора поколений Dangdang Dangdang ~ Dangdang dangdang ~ для дебюта.
Сборка мусора = Обнаружение мусора + Выпуск.
Идея повторного использования поколений делит объекты на три поколения (поколение 0, 1, 2): 0 представляет молодые объекты, 1 представляет молодые объекты и 2 представляет старые объекты.Согласно гипотезе слабого поколения (молодые объекты чаще умирают, а старые обычно живут дольше).Новорожденный объект помещается в поколение 0, и если объект переживает сборку мусора gc в поколении 0, то он помещается в поколение 1 (он обновляется). Если объект в поколении 1 пережил сборку мусора gc в поколении 1, он помещается в поколение 2. gc.set_threshold(threshold0[threshold1[threshold2]]) Устанавливает порог, срабатывающий при каждом поколении сборки мусора в gc.После последней сборки мусора 0-го поколения, если количество выделенных объектов за вычетом количества освобожденных объектов больше порога 0, то проверка сборки мусора GC будет выполняться для объектов в 0-м поколении.Начиная с последней сборки мусора 1-го поколения, если количество раз сборки мусора сборщиком мусора в 0-м поколении больше порога 1, то проверка сборки мусора будет выполняться для объектов в 1-м поколении. Аналогичным образом, начиная с последней сборки мусора 2-го поколения, если количество сборок мусора GC в 1-м поколении превышает пороговое значение2, то проверка сборки мусора GC будет выполняться для объектов во 2-м поколении.
Это просто, чтобы закончить GC Python, закончив работу.