Назад к вопросам
Junior
124
questionbank
Что такое сборщик мусора (garbage collector) в Python?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Сборщик мусора в Python — это механизм автоматического управления памятью, который освобождает память объектов, на которые больше нет ссылок, или которые участвуют только в циклических ссылках без внешних ссылок.
Python использует два основных механизма сборки мусора:
-
Подсчет ссылок (Reference Counting):
- Каждый объект хранит счетчик ссылок, указывающий, сколько переменных или других объектов ссылаются на него.
- Когда счетчик ссылки объекта становится равным нулю, объект считается мусором и его память немедленно освобождается.
- Это простой и эффективный метод, но он не решает проблему циклических ссылок.
-
Обнаружение циклических ссылок (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()