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