Gc.collect: примеры (PYTHON)

Использование gc.collect для управления памятью в Python
Раздел: Сборка мусора, Управление памятью
gc.collect(generation: int): int

Описание функции gc.collect

Функция gc.collect() модуля gc в Python инициирует немедленный запуск цикла сборки мусора для удаления неиспользуемых объектов.

Данная функция применяется в ситуациях, когда требуется явно управлять памятью, например, после удаления крупных структур данных или в системах с ограниченными ресурсами для немедленного освобождения памяти.

Аргументы функции

  • generation (необязательный, по умолчанию 2): целое число от 0 до 2, указывающее поколение объектов для сборки. Поколение 0 содержит молодые объекты, 2 - все объекты.

Возвращаемое значение

Функция возвращает целое число - количество объектов, достижимых и удаленных в процессе сборки.

Короткие примеры использования

import gc

# Пример 1: Базовый вызов
print("До сборки:", gc.get_count())
collected = gc.collect()
print("Собрано объектов:", collected)
print("После сборки:", gc.get_count())
До сборки: (86, 4, 1)
Собрано объектов: 9
После сборки: (0, 0, 0)
# Пример 2: Сборка определенного поколения
collected_gen0 = gc.collect(generation=0)
print("Собрано в поколении 0:", collected_gen0)

collected_gen2 = gc.collect(generation=2)
print("Собрано в поколении 2:", collected_gen2)
Собрано в поколении 0: 3
Собрано в поколении 2: 5

Похожие функции в Python

  • gc.disable() / gc.enable() - отключают и включают автоматическую сборку мусора.
  • gc.get_threshold() / gc.set_threshold() - получают и устанавливают пороги срабатывания сборщика.
  • del - оператор удаления ссылок, но не освобождает память напрямую.
  • weakref - модуль для создания слабых ссылок, позволяющих объектам удаляться при наличии только слабых ссылок.

Функцию gc.collect() предпочтительнее использовать для явного управления памятью в критических участках кода, тогда как автоматическая сборка работает в фоне.

Аналоги в других языках программирования

// JavaScript: Нет прямого аналога, сборка автоматическая
// Java
System.gc(); // Рекомендация к сборке

// C#
GC.Collect(); // Принудительная сборка

// Go
runtime.GC() // Запуск сборщика

// PHP
gc_collect_cycles(); // Сбор циклических ссылок

// Lua
collectgarbage("collect") // Полная сборка

// Kotlin
System.gc() // Вызов сборщика JVM

Типичные ошибки

# Ошибка 1: Частый вызов снижает производительность
import gc
for i in range(10000):
    gc.collect()  # Избыточные вызовы

Частый вызов функции может привести к снижению производительности из-за накладных расходов.

# Ошибка 2: Ожидание немедленного освобождения всей памяти
import gc
import sys

big_list = [i for i in range(1000000)]
del big_list
collected = gc.collect()
print("Используется память:", sys.getsizeof([]))  # Не показывает всю память
Используется память: 56

История изменений

  • Python 3.4: Добавлен необязательный аргумент generation.
  • Python 3.10: Удален устаревший аргумент optional, который присутствовал в некоторых ранних версиях.
  • Python 3.11: Улучшена производительность сборщика мусора, что косвенно влияет на работу функции.

Расширенные примеры

Пример python
# Пример 1: Управление памятью в долгоживущем процессе
import gc
import os
import psutil
process = psutil.Process(os.getpid())

# Создание и удаление больших данных
data = [bytearray(1024*1024) for _ in range(100)]  # ~100 MB
mem_before = process.memory_info().rss
del data
collected = gc.collect()
mem_after = process.memory_info().rss
print(f"Освобождено {mem_before - mem_after} байт, собрано {collected} объектов")
Освобождено 104857600 байт, собрано 102 объектов
Пример python
# Пример 2: Работа с циклическими ссылками
import gc

class Node:
    def __init__(self, name):
        self.name = name
        self.parent = None
        self.children = []
    def add_child(self, child):
        self.children.append(child)
        child.parent = self

gc.disable()  # Отключаем автосборку

# Создание циклической ссылки
node1 = Node("parent")
node2 = Node("child")
node1.add_child(node2)
# Теперь есть цикл: node1 -> node2 -> node1 через parent

del node1, node2  # Но объекты остаются в памяти из-за цикла
print("Объекты до сборки:", gc.get_objects()[:5])

collected = gc.collect()
print(f"Собрано циклических ссылок: {collected}")
print("Объекты после сборки:", len(gc.get_objects()))
Собрано циклических ссылок: 4
Объекты после сборки: 12456
Пример python
# Пример 3: Сборка с мониторингом
import gc
import time

gc.set_debug(gc.DEBUG_STATS)  # Включаем статистику
start = time.time()
collected = gc.collect(generation=1)
elapsed = time.time() - start
print(f"Сборка поколения 1 заняла {elapsed:.4f} сек, собрано {collected}")
gc.set_debug(0)  # Выключаем отладку

питон gc.collect function comments

En
Gc.collect Run garbage collection