Назад к вопросам
Junior
124
questionbank

Что такое сборщик мусора (garbage collector) в Python?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Сборщик мусора в Python — это механизм автоматического управления памятью, который освобождает память объектов, на которые больше нет ссылок, или которые участвуют только в циклических ссылках без внешних ссылок.

Python использует два основных механизма сборки мусора:

  1. Подсчет ссылок (Reference Counting):

    • Каждый объект хранит счетчик ссылок, указывающий, сколько переменных или других объектов ссылаются на него.
    • Когда счетчик ссылки объекта становится равным нулю, объект считается мусором и его память немедленно освобождается.
    • Это простой и эффективный метод, но он не решает проблему циклических ссылок.
  2. Обнаружение циклических ссылок (Generational Cyclic Garbage Collector):

    • Работает в дополнение к подсчету ссылок.
    • Обнаруживает группы объектов, которые ссылаются друг на друга, но на которые нет ссылок извне этой группы.
    • Использует алгоритм маркировки-удаления и работает в несколько "поколений" для оптимизации. Новые объекты находятся в молодом поколении, и сборка мусора в нем происходит чаще.
# Пример подсчета ссылок
a = [] # Счетчик ссылки для [] = 1
b = a  # Счетчик ссылки для [] = 2
c = b  # Счетчик ссылки для [] = 3
del a  # Счетчик ссылки для [] = 2
del b  # Счетчик ссылки для [] = 1
del c  # Счетчик ссылки для [] = 0, память освобождается
# Пример циклической ссылки
class Node:
    def __init__(self, value):
        self.value = value
        self.next = None
        self.prev = None

a = Node(1)
b = Node(2)

a.next = b
b.prev = a
# Здесь a и b ссылаются друг на друга

del a
del b
# Счетчик ссылок a и b станет 1 из-за взаимных ссылок.
# Объекты все еще в памяти, несмотря на удаление переменных a и b.
# Сборщик мусора циклических ссылок обнаружит и освободит их.

Сборщик мусора управляется модулем gc. Его можно настроить или отключить, хотя обычно это не рекомендуется.

import gc

# Проверка включения сборщика мусора
print(gc.isenabled())

# Включение/отключение сборщика мусора
# gc.disable()
# gc.enable()

# Запуск сборщика мусора вручную
# gc.collect()