ガーベジコレクション | Raspberry Pi Pico

つぶやき

マイコン環境ではメモリ資源が限られており、不要になったメモリを再利用可能にする仕組み=「ガーベジコレクション(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

コメント