Модуль gc
Управление сборщиком мусора (garbage collection)
Модуль gc управляет сборкой мусора в куче MicroPython. Он учитывает память Python-объектов; свободная память FreeRTOS и сетевые пулы lwIP в эти показатели не входят.
collect
gc.collect() запускает сборку мусора вручную и возвращает None. Освобождаются недостижимые объекты: те, на которые больше нет сохраняемых ссылок. Само наличие объекта в локальной/глобальной переменной, контейнере или очереди callback может сохранять его живым.
Сборщик консервативный: даже после del не гарантируется немедленное освобождение всей ожидаемой памяти. Память может быть фрагментирована, поэтому большой объект способен вызвать MemoryError при ненулевом mem_free().
import gc
before = gc.mem_free()
data = bytearray(1024)
del data
gc.collect()
print('До:', before, 'после:', gc.mem_free())
enable
gc.enable() включает автоматическую сборку.
disable
gc.disable() выключает автоматическую сборку, но не запрещает выделение памяти и ручной collect().
isenabled
gc.isenabled() возвращает bool — включена ли автоматическая сборка.
При отключённой автоматической сборке куча может исчерпаться. Возвращайте прежний режим даже при исключении:
import gc
was_enabled = gc.isenabled()
gc.disable()
try:
# Короткий участок с заранее ограниченным выделением памяти.
pass
finally:
if was_enabled:
gc.enable()
mem_alloc
gc.mem_alloc() возвращает занятый объём кучи Python в байтах.
mem_free
gc.mem_free() возвращает доступный объём кучи Python в байтах. Это показатели распределителя памяти, а не размер полезных данных в переменных.
threshold
gc.threshold()
gc.threshold(amount)
Без аргумента возвращает текущий дополнительный порог либо -1, если он отключён. При неотрицательном amount автоматическая сборка может запускаться после накопленного выделения указанного количества байт, не дожидаясь нехватки памяти. Значение округляется вниз до размера блока GC (16 байт в этой сборке). Отрицательное значение отключает дополнительный порог. Изменение порога не включает сборщик, выключенный через disable().
Сокеты и завершение сценария
Живой сокет остаётся открытым при обычном gc.collect(). Для недостижимых сокетов финализатор освобождает TCP/UDP/RAW-ресурсы. При завершении или остановке сценария runtime освобождает его нативные ресурсы перед повторным использованием Python-кучи.
В прикладном коде закрывайте сокеты явно через close() в finally: это освобождает ресурсы в нужный момент, без ожидания GC. Возможность закрытия через сборщик — резервный механизм.
На контроллере проверены сохранение живого UDP-сокета при GC, повторная финализация TCP/UDP/RAW и освобождение привязанных TCP/UDP-портов после обычного завершения и команды stop. Это не означает, что отдельным тестом проверены все настройки порога GC.