【驚愕】メモリを64GBに増設したのに空き容量が減る謎 エンジニアも騙される「RAMの真実」
ゲームやAIのためにPCのメモリを64GBまで増設したのに、何もしていないのにタスクマネージャー上で15GBも消費されている――。増設後に空き容量がむしろ減るという現象は、多くのユーザーを困惑させる定番の疑問だ。「ウイルスに感染したのでは」「初期不良では」と不安になる声も多いが、結論から言えばこれは不具合でも異常でもない。現代OSが意図的に行っている、極めて優秀な最適化の結果である。
「使われていないRAMは無駄なRAM」
コンピューターの世界には「Unused RAM is wasted RAM(使われていないRAMは無駄なRAM)」という古くからの設計思想がある。メモリは単なるデータの保管庫ではなく、高速なCPUと相対的に低速なストレージの間にある巨大なバッファとして機能するのが本来の役割だ。
CPUが目の前のデスクで仕事をしているとすれば、ストレージは遠く離れた倉庫のようなもの。手元に巨大なデスクがあるなら、いちいち倉庫へ資料を取りに行くより、デスクの上に大量の資料を広げておいた方が効率的に決まっている。OSは物理メモリ量を認識すると即座に管理戦略を切り替え、余剰リソースを前提とした攻撃的なヒューリスティクスへ移行する。つまり容量が減っているのではなく、システム全体を高速化するためにわざと確保し続けているのだ。
ページキャッシュとダーティページの仕組み
OSが物理メモリを消費する最大要因の一つが、仮想ファイルシステム(VFS)と連携したページキャッシュだ。アプリケーションがファイルにアクセスする際、OSは直接ストレージを読みに行かず、まずメインメモリ上のキャッシュを確認する。ここにデータがあれば超高速な応答が可能で、ディスクアクセス自体を完全に回避できる。メモリを増設すればこのキャッシュ領域は自動的に拡大し、バックグラウンドのインデックス作成やライブラリ読み込みなどで一度触れたデータはメモリに残り続ける。
書き込みにも遅延評価が働いている。保存時、即座にストレージへ書き込むのではなく、メモリ上のページを「ダーティ」とマークするだけで実際の書き込みは後でまとめて非同期に行われる。カーネルパラメータのvm.dirty_background_ratioはシステム全体のメモリに対する割合で設定されるため、64GB環境では約6.4GBものダーティページを溜め込める計算になり、常に多くのメモリが確保され続ける。
MGLRUとウォーターマークという賢い調整
キャッシュ管理も進化している。伝統的なLRUアルゴリズムは巨大なメモリ空間ではCPUのロック競合やスラッシングを引き起こす限界を迎えていたため、Linuxカーネル6.2以降では世代別に管理するMGLRUが導入された。ページを複数の世代に分け、ハードウェアのアクセス検知を使ってバッチ処理で昇格・降格を判断する仕組みで、メモリ増設により保護対象の絶対数が大幅に増えるため、古いデータも長期間保持されるようになる。
さらにカーネルにはmin_free_kbytesというパラメータがあり、システム起動時に搭載メモリ量に応じて非線形にスケーリングする。メモリが増えるほど安全地帯も広がり、警告ラインの絶対値も大きくなるため、より早い段階から回収処理が発動する。回収が間に合わず完全に枯渇するとプロセス自身が停止するダイレクトリクレイムという最悪の事態になるため、OSは余裕のあるうちから慎重に準備を進めるのだ。
アプリケーション側もメモリを囲い込む
ユーザー空間でも同様の戦略が取られている。glibcやjemallocといったモダンなアロケータは、スレッドごとの独立したメモリプール「アリーナ」を作成して囲い込み、解放されたメモリをすぐOSへ返却せずプロセス内に滞留させる。MADV_FREEというシステムコールフラグによる遅延解放は、再アクセスされればコストゼロで即再利用できる強力な最適化だ。
JavaのJVMやJavaScriptのV8エンジンなどGCを持つランタイムも、搭載メモリ量を見てヒープサイズを直接変化させる。JVMのMaxRAMPercentageはデフォルトで物理メモリの1/4まで自動拡張されるため、16GB時代に4GBだったヒープが64GB増設後は勝手に16GBまで広がる。ガベージコレクションの実行はアプリケーションを一時停止させる「Stop The World」を伴うため、スループット重視のアルゴリズムは与えられたヒープを限界まで使い切るまで回収を遅延させる。枠が広がるほど掃除を我慢するのは、処理を止めないための合理的な選択なのだ。
ゼロコピーとAI推論への恩恵
この大量消費はハードウェアレベルで明確な見返りをもたらす。ゼロコピー技術を使えば、カーネル空間のページキャッシュからネットワークソケットへ直接データを流せ、単なるコピーのためにCPUサイクルを浪費しない。NVMe SSDからの読み出し回数も激減し、PCIeの帯域幅をGPUとの転送など本当に必要な計算に振り向けられる。
特に顕著なのがAppleシリコンなどのユニファイドメモリ環境だ。CPUとGPUが同じメモリ空間を共有するため、OSがキャッシュとして保持する巨大なモデルデータにGPUがポインタで直接アクセスでき、転送時間がほぼゼロになる。AI推論のテキスト生成速度は、このメモリ常駐に強力に支えられている。監視ツールの見栄えのために無理にキャッシュを破棄して空き容量を作れば、推論のたびにSSDからモデルを読み直す羽目になり、かえって最新ハードウェアの性能を殺してしまう。
本当に見るべきは別の指標
空き容量の数字だけでシステムの健康状態を測るのは、現代のアーキテクチャでは意味をなさない。むしろ空きが大量にある状態は、キャッシュが育っておらずパフォーマンスを出し切れていない証拠とも言える。確認すべきはOOMキラーの発生頻度やページフォルトの遅延、スワップの発生状況だ。これらが静かなら、メモリ使用率が高くてもシステムは健全に動いている。
AIの所感
メモリ使用量の増加は「汚れ」ではなく「予測的最適化」の証である、という視点は多くの誤解を解いてくれる。ハードウェアの値上がりが続く今、高価になったメモリを1ビットたりとも遊ばせず有効活用しようとするOSとランタイムの姿勢は、むしろ感心すべき設計哲学だろう。問題は数字の見方をユーザー側がアップデートしていないことにある。タスクマネージャーの空き容量に一喜一憂する時代は終わり、快適さの正体は裏側で積み上げられたキャッシュにあることを知っておきたい。

