中堅プログラマーの備忘録

忘れっぽくなってきたので備忘録として・・・

【C#.net】WMIから取得したメモリ関連データの正確性について調べてみる

1.概要

PCのメモリ使用率を定期的に取得し、リークがないか?無駄にメモリを消費していないか?
等を調べることはよくあることだと思います。
開発中のアプリケーションなどは、これに当てはまるのではないでしょうか?

今回は【WMI】で取得したメモリ関連のデータと
タスクマネージャーで表示されているデータを比較してみたいと思います。


2.物理メモリ、仮想メモリ

メモリは大きく【物理メモリ】と【仮想メモリ】に分けられます。
物理メモリは名前のとおりPCのマザーボードに刺さっているDDR4とかのやつです。
これとは別に仮想メモリというものが存在します。
これは何かというと

ハードディスクの一部をメモリとして使用してしまおう
といったものになります。
Windowsでは【pagefile.sys】という名前のファイルで領域が確保されています。
※隠しファイルになっています。


どのように使用されるかというと
物理メモリが不足した際に一時的に仮想メモリにデータを退避するという役割をになっています。
非常に便利だと感じるかもしれませんが、速度が遅いというデメリットもありますので
メモリが足りないから、仮想メモリの領域を増やそう
といった単純なものではないので注意が必要です。


3.仮想メモリの領域について

仮想メモリの領域はどのようにして決めているのかというと
【コントロールパネル】→【システムとセキュリティ】→【システム】
システムのプロパティを開きます。
【詳細設定】タブの【パフォーマンス】にある【設定】を開きます。

ここでも【詳細設定】タブの【仮想メモリ】を確認します。
f:id:tsu--kun:20210531134228p:plain

現在確保されている【仮想メモリ領域】は【2432MB】であることがわかります。

変更するには【変更】ボタンをクリックして行います。


4.スクリプト

該当するスクリプトは下記のとおりです。
※【System.Management】を参照に追加する必要があります。

System.Management.ManagementClass mc = new System.Management.ManagementClass("Win32_OperatingSystem");
System.Management.ManagementObjectCollection moc = mc.GetInstances();
foreach (System.Management.ManagementObject mo in moc)
{

    //物理メモリ合計
    Console.WriteLine($"物理メモリ合計:{mo["TotalVisibleMemorySize"]}");

    //物理メモリFree
    Console.WriteLine($"物理メモリFree:{mo["FreePhysicalMemory"]}");

    //総メモリ合計
    Console.WriteLine($"総メモリ合計:{mo["TotalVirtualMemorySize"]}");

    //総メモリFree
    Console.WriteLine($"総メモリFree:{mo["FreeVirtualMemory"]}");
    mo.Dispose();
}
moc.Dispose();
mc.Dispose();


結果は下記のとおりになりました。
物理メモリ合計:16629752KB
物理メモリFree:8126512KB
総メモリ合計:19120120KB
総メモリFree:9578100KB

メモリの総領域とFree領域を取得しています。


※【TotalVirtualMemorySize】と【FreeVirtualMemory】は
純粋な仮想メモリではなく
【物理メモリ】 + 【仮想メモリ】の値が取得されるようです。
ですので今回はあえて
【総メモリ】という書き方にさせて頂いています。

詳しくは下記参照
docs.microsoft.com


5.結果解析

【WMI】から取得した結果と【タスクマネージャー】の内容を見比べてみたいと思います。

まずはタスクマネージャに表示されている内容について
今回必要な項目のみをピックアップして解説してみます。

f:id:tsu--kun:20210531135021p:plain

①物理メモリの論理容量(16.0GB)

 16GBの物理メモリが搭載されているのが確認出来ます。

②使用可能な物理メモリの容量(15.9GB)

 【ハードウェア予約済】によって使えるメモリ量が若干減っている状態
 【ハードウエア予約済】とは
 BIOSまたは他の周辺機器のドライバーで使用するために予約されたメモリのこと

③使用中(8.1GB)

 実際に使用している物理メモリの容量

④利用可能(7.7GB)

 物理メモリの空き容量

⑤コミット済(9.1GB)

 総メモリ使用容量、つまり【物理メモリ使用容量】と【仮想メモリ使用容量】の合計

⑥コミット済(18.2GB)

 総メモリ容量、つまりこのPCで使用可能なメモリ領域


といった感じです。

ここからWMIとタスクマネージャーの値を比較してみます。
わかりやすいようにGBに単位を変更しました。

項目 WMI タスクマネージャー
物理メモリ合計 15.85GB 15.9GB
物理メモリFree 7.75GB 7.7GB
総メモリ合計 18.23GB 18.2GB
総メモリFree 9.13GB 9.1GB


※タスクマネジャーの総メモリFreeの計算は
総メモリ合計(18.2GB)-総メモリ使用量(9.1GB)

比較してみるとなかなかいい値が取得出来ているような気がします。


6.純粋な仮想メモリの計算方法について

純粋に仮想メモリの状況はどうなっているのか知りたい場合は
下記の計算でいけると思います。

仮想メモリFree

【総メモリ合計】 - 【総メモリ使用量】 - 【物理メモリFree】
18.2GB - 9.1GB - 7.7GB = 1.4GB

仮想メモリ合計

【仮想メモリFree】 + (【総メモリ使用量】 - 【物理メモリ使用量】)
1.4GB + 9.1GB - 8.1GB = 2.4GB


【仮想メモリ領域】は【2432MB】なので
値的に合ってそうです。

今回の発端は純粋な仮想メモリについてのデータを取得したい
ということから始まりました。
一応、目的は達成できたのではと思います。