Модуль 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.