🖥️

[UE5]stat MemoryPlatformの表示内容を調べてみた

に公開

はじめに

UEのコンソールコマンドの一つstat MemoryPlatformで表示される内容を調べてみたので、その結果をまとめてみます。

stat MemoryPlatformでは、総合的なメモリの使用状況を確認できます。

公式ドキュメントには以下のように記載されています。

MemoryPlatform メモリのプラットフォームに関する情報を表示します。

コマンド名に「Platform」とついているだけあり、表示される情報はプラットフォームごとに実装されています。
Windowsの場合はWindowsPlatformMemoryにて各情報の取得がされているようです。

継承元はどのプラットフォームも同じであり大半は同じ情報が表示されるため、Windows以外でも今回調べた内容は役立つかと思います。

確認環境

  • UE5.3.2
  • Windows 11

stat MemoryPlatformを打つと以下の情報が表示されます。

以降、表示情報の各項目について記載します。

Total Virtual / Total Physical

メモリの総量(Total)を表しています。
Virtualは「仮想メモリ」、Physicalは「物理メモリ」を表しています。

物理メモリ?

物理メモリのほうがわかりやすいのでまずこちらから。
これはパソコンやスマホ、ゲーム機などに搭載されているRAMのことを指しています。
冒頭のスクショだとTotal Physical 32606.96 MBと表示されていますが、これは自分のPCに32GBのRAMを積んでいるからですね。

仮想メモリ?

次に、仮想メモリです。
これはOSによって割り当てられた仮想的なメモリを指しています。

OS上で動作するアプリ(プロセス)には仮想メモリ(アドレス空間)が割り当てられ、プロセスはその割り当てられたアドレス空間を使用します。
プロセスでは、割り当てられた仮想メモリのアドレスに対して読み書きを行い、物理メモリのアドレスを直接指定して読み書きすることはありません。
仮想メモリと物理メモリのアドレスのマッピングはOS側で行われます。

なぜ、わざわざ仮想メモリなんて割り当てるの?物理メモリに直接読み書きしたらダメなの?と思うかもしれませんが、OSがメモリ管理を効率的・安全に行うための重要な仕組みとなっています。

  • プロセスごとの独立したアドレス空間をもてる
    • 各プロセスは0x00000000から始まる仮想のアドレス空間を持てる(他のプロセスが使用しているメモリ領域を意識する必要がない)
    • 他のプロセスのメモリ領域へ直接アクセスできないため、プロセス間の不正な干渉が防がれ、セキュリティや安定性が向上する
  • アドレス空間の再配置や共有ができる
    • 1つのDLLを複数プロセスの仮想メモリにマッピングすることができ、効率的にメモリを共有できる(プロセスの数だけDLLを物理メモリ上に読み込む必要がない)
    • アプリの再起動時に同じ仮想アドレスでマッピングできるためポインタの再計算が不要

などが挙げられます。
ここを掘り下げると話がずれてしまうため詳細は割愛しますが、物理メモリに直接読み書きするのでは都合が悪いため、仮想メモリが割り当てられています。

詳しく知りたい方は以下が参考になります。
https://hekatimebox.main.jp/wordpress/2024/03/computer-5/
https://ja.wikipedia.org/wiki/仮想記憶
https://qiita.com/wqwq/items/894bd2ed99a9788183ec

Available Physical / Available Virtual

利用可能(Available)な物理メモリ、仮想メモリの量です。
それぞれの空き容量を指しています。

メモリが不足した場合の挙動はプラットフォームごとに異なります。

Windows/Linux/macOSなどのPC系OSの場合では、通常「物理メモリ総量 < 仮想メモリ総量」となりますが、仮想メモリの使用量が物理メモリを超えると不足分をHDDやSSDなどのディスクへ退避(スワップ)します。ただしディスクはRAMに比べて遅いため、物理メモリを超えると動作は不安定・低速になりがちです。

スワップを持たないプラットフォームの場合では、単にアプリがクラッシュする場合や、バックグラウンドアプリの終了+それでも物理メモリが不足する場合はクラッシュする、という挙動をとったりします。

Peak Used Virtual

仮想メモリの使用量の最高値(peak)です。

Used Virtual

現在の仮想メモリの使用量です。

Peak Used Physical

物理メモリ使用量の最高値(Peak)です。
ゲームで必要な最低メモリ量はこれを参考にすると良いです。

Used Physical

現在の物理メモリの使用量です。

Page Size

メモリの「ページ」のサイズを表します。

ページ?

OSがメモリ管理する際の最小単位です。
Windowsでは通常 1ページ = 4KB となっています。
仮想メモリと物理メモリのマッピングはこのページ単位で対応づけられます。

冒頭に載せたstat MemoryPlatformの画面では0MBと表示されていますが、MB単位に変換され丸めこまれたことによって0表示となっています。

試しにバイト単位でそのまま表示させてみたところ 4096B = 4KB が表示されました。

UnrealClient.cpp
@@ -418,1 +418,1 @@
-    return FString::Printf( TEXT( "%.2f MB" ), float( Value / (1024.0 * 1024.0) ) );
+    return FString::Printf( TEXT( "%f B" ), Value );

Engine/Source/Runtime/Engine/Private/UnrealClient.cpp

Total physical GB

「Total Physical」をギガバイト表記したものです。

…ただし、stat MemoryPlatformの画面では「0MB」と表示されてしまいます。
「0MB?GBじゃなくてMB?」と違和感を覚えますが、これは内部処理の単位変換に起因しています。

先ほどのPage Sizeと同じようにバイト単位でそのまま表示させたところ 32B と表示されました。

内部的にはGB単位で値を扱っているようですが、他の項目と同様にMB単位に変換されて表示されるため、 32B が丸め込まれて 0MB と表示されていました。

Windows Specific Memory Stat

この項目はWindows環境でのみ表示されるものとなり、他のプラットフォームでは別の項目が表示されます。
Windows固有の何かしらのメモリ統計表示(予定?)だと思うのですが、現状では初期値0以外に値が代入されておらず、未使用のようでした。

まとめ

stat MemoryPlatform は、物理メモリ・仮想メモリの使用状況を総合的に確認できる便利なコマンドです。
開発中に特に注目すべきは以下の項目です。

  • Peak Used Physical
    実行中に必要となる物理メモリの最大量。
    → 最低メモリ要件の参考になる。
  • Used Physical
    現在の物理メモリ使用量
    → 負荷テストやリーク検出に便利。
  • Available Physical
    現在の物理メモリ残容量。
    → クラッシュやパフォーマンス低下の予兆確認に役立つ。

メモリ周りで問題が起きたときには役立つので、覚えておいて損はないと思います。

Discussion