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のグラフが下がります。