マイコン環境ではメモリ資源が限られており、不要になったメモリを再利用可能にする仕組み=「ガーベジコレクション(GC: garbage collection)」が重要です。MicroPythonでは gc.collect() や gc.mem_free() 等を使って、手動・自動での回収・監視が可能です。今回は、LED点灯+シリアル出力を活用して「GC がいつ走ったか」を視覚的・数値的に確認できる仕組みを紹介します。
プログラム概要
- Raspberry Pi Pico W 上で定期的にメモリを消費する処理(例:大きめのリストを生成)を実行。
gc.mem_free()で現在のヒープ空きメモリ量を測定。- 空きメモリが設定値を下回ったら
gc.collect()を実行。 - LED を「GC実行中」に点灯させ、実際の収集タイミングを視覚化。
- シリアル出力にて、空きメモリ量の変化も表示。
コード(MicroPython)
import gc
import time
from machine import Pin
# LED設定
led = Pin("LED", Pin.OUT)
# 初期状態のメモリ確認
print("===== ガーベジコレクション可視化デモ =====")
print("起動時空きメモリ:", gc.mem_free(), "bytes")
# メモリを監視して自動的にGCを発動する関数
def monitor_memory(threshold=20000):
free_mem = gc.mem_free()
print(f"現在の空きメモリ: {free_mem} bytes")
if free_mem < threshold:
print("⚠️ 空きメモリが少ないため gc.collect() を実行します。")
led.on() # LED点灯(GC作動中)
gc.collect()
time.sleep(0.5)
led.off()
print("✅ 回収後の空きメモリ:", gc.mem_free(), "bytes")
# ダミーでメモリを使う処理
def heavy_task():
dummy = []
for i in range(3000):
dummy.append(i * i)
time.sleep(0.05)
# メインループ
while True:
heavy_task() # メモリを消費する処理
monitor_memory(20000) # 空きメモリを監視&必要ならGC
time.sleep(1)
実行結果イメージ
===== ガーベジコレクション可視化デモ =====
起動時空きメモリ: 116512 bytes
現在の空きメモリ: 109864 bytes
現在の空きメモリ: 87432 bytes
⚠️ 空きメモリが少ないため gc.collect() を実行します。
✅ 回収後の空きメモリ: 112008 bytes
現在の空きメモリ: 108760 bytes
...🟢 LEDが点灯した瞬間が「GCが走っている」タイミングです。
コードのポイント解説
| 要素 | 役割 |
|---|---|
gc.mem_free() | 現在のヒープの空きバイト数を取得します。 |
gc.collect() | ガーベジコレクションを実行します。 |
threshold(20,000バイト) | 空きメモリがこの値を下回ったらGC実行する簡易トリガー |
heavy_task() | 擬似的にメモリを消費する処理。実際にはセンサー読み取り・通信バッファなどに応用可 |
応用アイデア
- Wi-Fi通信やHTTP通信の後に
gc.collect()を入れ、空きメモリを確認して安定化を図る。 - 天気予報メール送信システムなどで、送信毎に
gc.collect()を入れて、長時間運転に備える(ユーザーの用途に合致)。
参考URL
gc – control the garbage collector — MicroPython latest documentation

コメント