Go言語のメモリ管理図解

CloudWatchでメモリ使用率が「高止まり」するのはなぜ?
下にスクロールして、Goランタイムの内部挙動を覗いてみましょう。

1. アイドリング状態

システムは落ち着いています。
グレーの領域はOS(AWSインフラ)が持っているメモリです。
Goのコンテナ(オレンジ枠)は、起動に必要な最小限のメモリだけを確保しています。

まだ平和な状態です。

2. トラフィック急増(Alloc)

アクセスが集中しました!
アプリケーションは処理のために大量のメモリを必要とします。
GoランタイムはOSからメモリをガッツリ借りてきます(青色のブロック)。

CloudWatchのメモリグラフが急上昇するのはここです。

3. 処理完了 & GC

リクエスト処理が終わりました。
使っていたデータは不要になり、「ゴミ(赤色のブロック)」になります。
ここですぐにガベージコレクション(GC)が走りますが...?

4. メモリの抱え込み(重要!)

GCがゴミを掃除しました。
しかし、GoはこれをOSには返却せず、「自分の手持ちの空き地(オレンジのブロック)」としてキープします。

ここがポイント:
中身は空っぽですが、OSから見ると「Goが確保中」のままです。
これがグラフの「高止まり(引きずり)」の正体です。

5. 再利用(高速化)

次のリクエストが来ました。
Goは、さっきキープしておいた「空き地」を即座に使います。
OSにお願いしに行く必要がないので、爆速でメモリを確保できます。

「返さない」のは「次を速くするため」の戦略なのです。

6. 返却(Scavenger)

しばらく暇な時間(数分〜)が続きました。
Goの「Scavenger(掃除係)」が動き出し、余っている空き地をOSに返します。
ここで初めてCloudWatchのグラフが下がります。

Memory Status Idling
Used Garbage Cached