仕事などでプログラムを作ると、「作ったプログラムがシステムに悪影響を及ぼさないか」を確認する必要性があり、そのうちの一つに「プログラムがメモリを占有していない」ことを確認することがあります。
PC内で使うことができるメモリのサイズを取得する
WMIでメモリサイズを取得する
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("合計物理メモリ:{0}KB", mo["TotalVisibleMemorySize"]); //利用可能な物理メモリ Console.WriteLine("利用可能物理メモリ:{0}KB", mo["FreePhysicalMemory"]); //合計仮想メモリ Console.WriteLine("合計仮想メモリ:{0}KB", mo["TotalVirtualMemorySize"]); //利用可能な仮想メモリ Console.WriteLine("利用可能仮想メモリ:{0}KB", mo["FreeVirtualMemory"]); mo.Dispose(); } moc.Dispose(); mc.Dispose();
Devices.ComputerInfoでメモリサイズを取得する
Microsoft.VisualBasicを参照に追加します。
下記のようなコードで物理メモリ、仮想メモリのサイズが取得できます。
// My.Computer.Infoを使用する方法 Microsoft.VisualBasic.Devices.ComputerInfo info = new Microsoft.VisualBasic.Devices.ComputerInfo(); //合計物理メモリ Console.WriteLine("合計物理メモリ:{0}KB", (info.TotalPhysicalMemory/1024)); //利用可能な物理メモリ Console.WriteLine("利用可能物理メモリ:{0}KB", (info.AvailablePhysicalMemory/1024)); //合計仮想メモリ Console.WriteLine("合計仮想メモリ:{0}KB", (info.TotalVirtualMemory/1024)); //利用可能な仮想メモリ Console.WriteLine("利用可能仮想メモリ:{0}KB", (info.AvailableVirtualMemory/1024));
VB.NETでプログラミングされる方は、コメントにあるように’My.Computer.Info’だけで取得できます。
自分のプログラムがどのくらいメモリを使用しているかを調べる
自分のプログラムがどのくらいメモリを使っているか知らなければいけないこともあります。
そういったときに自分のプログラムがどのくらいメモリを使っているかを確認する方法が2つあります。
1つは、System.EnvironmentにあるWorkingSetプロパティ(long型)です。
これは、現在自分のプログラムが確保しているワーキングセットと呼ばれるメモリの使用量が取得できます。
long currentSet = Environment.WorkingSet; Console.WriteLine(string.Format("Environment.WorkingSet={0}", currentSet));
ここで気を付けてほしいこと
このコードなどでメモリ使用量をチェックするために「タスクマネージャ」を使われると思います。
ただ、「タスクマネージャ」がデフォルトで表示している”メモリ(プライベートワーキングセット)”とこのコードが表示している数値が違うので「これおかしくない?」と思われる方もおられるかもしれません。
実は、このコードが表示する「ワーキングセット」は「タスクマネージャ」がデフォルトで表示している”メモリ(プライベートワーキングセット)”ではなく、「タスクマネージャ」の[列の選択]で、メモリ(ワーキングセット)を表示しないと確認できません(まったく同じ値ではないですが、かなりの近似値で確認できます)。
もう1つは、System.Diagnostics.ProcessクラスのGetCurrentProcess()メソッドとRefresh()メソッドを用いる方法です。
System.Diagnostics.Process p = System.Diagnostics.Process.GetCurrentProcess(); p.Refresh(); Console.WriteLine("物理メモリ使用量: {0}", p.WorkingSet64); Console.WriteLine("仮想メモリ使用量: {0}", p.VirtualMemorySize64);
これらの方法で、自分のプログラムがどのくらいメモリを使っているかを確認することができます。
ただ、.NET Framework(C#、VB.NET)では、メモリの解放を明示的に行うことが少ないことと、メモリの管理はよくできているので「1回のチェック結果のメモリ使用量からプログラムが異常である。」という判断はしないよう注意して下さい。
1回チェックした瞬間はメモリの使用量が増えていても、しばらくたつとプログラムが何もしなくてもメモリ使用量が元に戻っていることがあります。
この辺りはMicrosoftのサイト「自動メモリ管理」にお任せします。