[UE5]stat MemoryPlatformの表示内容を調べてみた
はじめに
UEのコンソールコマンドの一つstat MemoryPlatform
で表示される内容を調べてみたので、その結果をまとめてみます。
stat MemoryPlatform
では、総合的なメモリの使用状況を確認できます。
公式ドキュメントには以下のように記載されています。
MemoryPlatform メモリのプラットフォームに関する情報を表示します。
コマンド名に「Platform」とついているだけあり、表示される情報はプラットフォームごとに実装されています。
Windowsの場合はWindowsPlatformMemory
にて各情報の取得がされているようです。
- Engine/Source/Runtime/Core/Public/Windows/WindowsPlatformMemory.h
- Engine/Source/Runtime/Core/Private/Windows/WindowsPlatformMemory.cpp
継承元はどのプラットフォームも同じであり大半は同じ情報が表示されるため、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を物理メモリ上に読み込む必要がない)
- アプリの再起動時に同じ仮想アドレスでマッピングできるためポインタの再計算が不要
などが挙げられます。
ここを掘り下げると話がずれてしまうため詳細は割愛しますが、物理メモリに直接読み書きするのでは都合が悪いため、仮想メモリが割り当てられています。
詳しく知りたい方は以下が参考になります。
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 が表示されました。
@@ -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