あなたのWindowsマシンのメモリは足りているのか

PC の動きが遅いと「メモリ不足」を疑うのは専門家以外にも広がっている認識だろうと思います。 スマホのスペックにもメモリ容量が記載され、機種によっては初期から「メモリ解放ツール」等が提供され、メモリは操作感と密接に関連している事は広く知られるようになったように感じます。

しかしながら、搭載しているメモリが十分か・操作感を悪化させている原因がメモリ不足なのかを知るのは容易では有りません。 現代の OS は複雑なメモリ管理を行っており、不足・充足が曖昧だからです。

この記事では Windows のメモリ管理の仕組みと、自分のマシンのメモリが足りているかを確認する手順を紹介します。

Windows タスクマネージャー

PC の動作が重い場合はタスクマネージャーを開く方も多いと思います。 PC 上のアプリケーションの性能に依存する代表的なコンポーネントの利用率を表示し、 性能を低下させている原因が分かるようになっています。

  1. CPU (使用率%)
  2. GPU (使用率%)
  3. ディスク (アクティブ時間%)
  4. メモリ (利用量%)

Windows のタスクマネージャーは以下のような表示で、見渡せるようになっています。

しかしながら、非常に負荷が高い時に CPU の使用率,GPU の使用率,ディスクのアクティブ時間は 100%になりますが、メモリの利用量は通常 70~90%程度を推移します。 タスクマネージャーの数字だけでメモリを不足を判断するのは非常に難しく、経験則に基づいたおおまかな判断を行うことしか出来ません。

Process Explorer

より詳細なメモリの情報を確認するために、Process Explorer を利用します。 Microsoft が提供する高機能版タスクマネージャーというような感じです。 適当な場所に展開して実行ファイルを開きます。

https://docs.microsoft.com/ja-jp/sysinternals/downloads/process-explorer

メニューの[View]->[System Information… Ctrl+I]->[Memory タブ]と移動します。 そうするとメモリの利用量の詳細な内訳が分かります。

タスクマネージャー上の「メモリ使用量」グラフと Process Explorer における”Physical Memory”のグラフは同義です。

Process Explorer メモリ使用量の読み方

使用量は「Used = Total(OS が利用可能なメモリ) - Available(開放可能な領域)」で計算できます。 現代の OS は搭載されたメモリを出来る限り全て使った上で高速化を行うので、Available は空き領域とは異なる概念です。

開放可能な領域は 「Available = Standby Page + Zeroed Page + Free Page」で計算できます。

Free Page は内容が不要になった領域で初期化前、Zeroed Page は初期化後のアプリケーションへ割当が可能なメモリ領域です。 本当に Windows が利用していないメモリ領域は「Free Page+Zeroed Page」ということで、それ以外の領域は全て有効に活用されているということです。

Used は主にワーキングセットで利用されており、各アプリケーションや OS やドライバが利用しているメモリ領域です。 利用頻度が低いものについては、Standby Page へ自動的に移動されます。

物理メモリが足りなくなれば、メモリ内容はページファイルと呼ばれるファイル(SSD,HDD)に書き写された上で物理メモリ上から内容を削除します。 そして必要になった際にはファイルから読み出して物理メモリ上へ書き戻します。 基本的には物理メモリと比べて SSD,HDD は非常に低速なので、物理メモリが不足するまでは、利用頻度の低い内容であっても可能な限り物理メモリ上に保持しているという仕組みになっています。

Standby Page はアクセスされる頻度に応じて Priority(優先順位)が決まっており、7 は最高でプロセス間で共有される内容・5 は通常のユーザが起動したアプリケーションが最初に入る場所・0 は最低でアクセス頻度が最も低い内容です。 使われる頻度が低ければ優先順位は下がっていきます。 メモリが必要になった時に、未利用のメモリ領域が不足(Zeroed Page の枯渇)しており内容をページファイルに追いやる必要があれば、Priority が低いものから内容が削除されます。

物理メモリ上に存在する内容とページファイルに存在する内容を全て足し合わせたメモリ総量は Commit Charge の Current から読み取れます。 物理メモリの使用量とコミットチャージの差が、ページファイルにのみ存在・物理メモリに読み込まれていないメモリ内容ということになります。

Paging Lists からメモリの枯渇を判断する

以上の内容を踏まえると「メモリが足りない」のフェーズは段階が有り緩やかに進むことが分かります。 そして、これはタスクマネージャーのメモリ使用量グラフだけでは判断がつかないです。

  1. アプリケーションが利用するメモリが全て物理メモリ上に存在する (Commit Charge が Used に収まっている)
  2. めったに使わないメモリ内容がページファイルに存在する (Zeroed は十分・Standby Page の Priority 0 も十分存在)
  3. 利用頻度が少し高いメモリ内容がページファイルに追いやられる (Zeroed が減少・Standby Page の Priority 0 の容量が 0)
  4. 利用頻度が中程度のメモリ内容がページファイルに追いやられる (Standby Page の Priority 0~4 の容量が 0)
  5. 通常アプリケーションのメモリ内容もページファイルに追いやられる (Standby Page の Priority 0~5 の容量が 0)
  6. 新たなメモリ割り当てを行うことが出来ない・アプリケーションの異常終了 (Zeroed, Free, Standby が枯渇)

12 は性能への影響はほぼなくメモリが十分に足りている状況と言えます。 35 が一般的に「パソコンが重い」の状況を引き起こし、高速に PC を使うためのメモリが不足している状況です。 6 はアプリケーションが異常終了するので、完全にメモリが不足しています。

一般的に「メモリが不足しているのか知りたい」というニーズにおいては、Free,Zeroed と Standby Page の Priority 0~5 あたりの状況を見れば理解できることが多いということでしょう。 メモリが不足して Windows の動作が遅くなっている PC においては、Standby Page の低い Priority に 0 が並ぶことになります。 また、ページファイルへの書き込みも多くなるので Paging File Write Delta も上昇して 0 より大きな数字が表示されます。

参考までにメモリが不足してパフォーマンスが落ちている状況(状態 4)のスクリーンショットです。メモリはあと 1 割近く利用可能ですが、Standby Page が減少しており頻繁に Paging File Write が発生して利用感はとても悪いです。

参考資料