合計メモリ使用量を%で確認できるパフォーマンスカウンターを作成しましたが、問題は、タスクマネージャーで表示されるのと同じ値が得られないことです。たとえば、私のプログラムは34%と言っていますが、タスクマネージャーは40%と言っています。
何か案は?
[〜#〜] note [〜#〜]
使用可能なRAMではなく、システムの利用可能なRAMを取得しようとしています。
現在のコード
private PerformanceCounter performanceCounterRAM = new PerformanceCounter();
performanceCounterRAM.CounterName = "% Committed Bytes In Use";
performanceCounterRAM.CategoryName = "Memory";
progressBarRAM.Value = (int)(performanceCounterRAM.NextValue());
labelRAM.Text = "RAM: " + progressBarRAM.Value.ToString(CultureInfo.InvariantCulture) + "%";
[〜#〜] edit [〜#〜]
プログレスバーとラベルをタイマーで毎秒更新します。
GetPerformanceInfo Windows APIを使用できます。Windows7のWindowsタスクマネージャーとまったく同じ値が表示されます。利用可能な物理メモリを取得するコンソールアプリケーションです。GetPerformanceInfoが返す他の情報を簡単に取得できます。MSDNを参照してください PERFORMANCE_INFORMATION MiBで値を計算する方法を確認するための構造ドキュメント。基本的にすべてのSIZE_T値はページ内にあるため、PageSizeで乗算する必要があります。
更新:このコードを更新して割合を表示しました。GetPerformanceInfoを2回呼び出しているため最適ではありませんが、アイデアが得られることを願っています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleApplicationPlayground
{
class Program
{
static void Main(string[] args)
{
while (true)
{
Int64 phav = PerformanceInfo.GetPhysicalAvailableMemoryInMiB();
Int64 tot = PerformanceInfo.GetTotalMemoryInMiB();
decimal percentFree = ((decimal)phav / (decimal)tot) * 100;
decimal percentOccupied = 100 - percentFree;
Console.WriteLine("Available Physical Memory (MiB) " + phav.ToString());
Console.WriteLine("Total Memory (MiB) " + tot.ToString());
Console.WriteLine("Free (%) " + percentFree.ToString());
Console.WriteLine("Occupied (%) " + percentOccupied.ToString());
Console.ReadLine();
}
}
}
public static class PerformanceInfo
{
[DllImport("psapi.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetPerformanceInfo([Out] out PerformanceInformation PerformanceInformation, [In] int Size);
[StructLayout(LayoutKind.Sequential)]
public struct PerformanceInformation
{
public int Size;
public IntPtr CommitTotal;
public IntPtr CommitLimit;
public IntPtr CommitPeak;
public IntPtr PhysicalTotal;
public IntPtr PhysicalAvailable;
public IntPtr SystemCache;
public IntPtr KernelTotal;
public IntPtr KernelPaged;
public IntPtr KernelNonPaged;
public IntPtr PageSize;
public int HandlesCount;
public int ProcessCount;
public int ThreadCount;
}
public static Int64 GetPhysicalAvailableMemoryInMiB()
{
PerformanceInformation pi = new PerformanceInformation();
if (GetPerformanceInfo(out pi, Marshal.SizeOf(pi)))
{
return Convert.ToInt64((pi.PhysicalAvailable.ToInt64() * pi.PageSize.ToInt64() / 1048576));
}
else
{
return -1;
}
}
public static Int64 GetTotalMemoryInMiB()
{
PerformanceInformation pi = new PerformanceInformation();
if (GetPerformanceInfo(out pi, Marshal.SizeOf(pi)))
{
return Convert.ToInt64((pi.PhysicalTotal.ToInt64() * pi.PageSize.ToInt64() / 1048576));
}
else
{
return -1;
}
}
}
}
タスクマネージャーによって報告される物理メモリの割合は、実際にPerformanceCounterが使用している% Committed Bytes In Use
とは異なるメトリックだと思います。
私のマシンでは、パフォーマンスモニターで表示すると、これらの値の間に20%の明確な違いがあります。
この記事 %Committed Bytesメトリックは、マシンの物理メモリだけでなく、ページファイルのサイズを考慮することを示します。これは、この値がタスクマネージャーの値より一貫して低い理由を説明します。
Memory \ Available Bytes
メトリックを使用してパーセンテージを計算する方が良いかもしれませんが、PerformanceCounterから物理メモリの合計量を取得する方法がわかりません。
パフォーマンスカウンターはお勧めできません。このコードを使用して、タスクマネージャーからメモリ使用率を取得します
var wmiObject = new ManagementObjectSearcher("select * from Win32_OperatingSystem");
var memoryValues = wmiObject.Get().Cast<ManagementObject>().Select(mo => new {
FreePhysicalMemory = Double.Parse(mo["FreePhysicalMemory"].ToString()),
TotalVisibleMemorySize = Double.Parse(mo["TotalVisibleMemorySize"].ToString())
}).FirstOrDefault();
if (memoryValues != null) {
var percent = ((memoryValues.TotalVisibleMemorySize - memoryValues.FreePhysicalMemory) / memoryValues.TotalVisibleMemorySize) * 100;
}
パフォーマンスモニターの下部にある[説明の表示]を使用できます。 引用する
%Committed Bytes In Useは、Memory\Committed BytesとMemory\Commit Limitの比率です。コミットされたメモリは、ディスクに書き込む必要がある場合にページングファイルにスペースが予約されている使用中の物理メモリです。コミット制限は、ページングファイルのサイズによって決まります。ページングファイルが拡大すると、コミット制限が増加し、比率が低下します)。このカウンターは、現在のパーセンテージ値のみを表示します。それは平均ではありません。
Soo yes PMはページングファイルを使用し、TMは実際のRAMを使用します。