47

合計メモリ使用量を%で確認できるパフォーマンスカウンターを作成しましたが、問題は、タスクマネージャーが表示するのと同じ値が得られないことです。例:私のプログラムは34%と言っていますが、タスクマネージャーは40%と言っています。

何か案は?


プロセスで使用されている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) + "%";

編集
プログレスバーとラベルをタイマーで毎秒更新します。

4

4 に答える 4

61

GetPerformanceInfo Windows APIを使用できます。これは、Windows7のWindowsタスクマネージャーとまったく同じ値を示します。これは、使用可能な物理メモリを取得するコンソールアプリケーションです。GetPerformanceInfoが返す他の情報を簡単に取得できます。方法については、MSDNPERFORMANCE_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;
      }

    }
  }
}
于 2012-04-05T12:06:21.850 に答える
15

パフォーマンスカウンターは良い考えではありません。このコードを使用して、タスクマネージャーからメモリ使用量の%を取得します

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;
}
于 2015-07-15T15:39:21.480 に答える
8

タスクマネージャーによって報告される物理メモリの割合は、実際には% Committed Bytes In UsePerformanceCounterが使用しているメトリックとは異なると思います。

私のマシンでは、パフォーマンスモニターで表示すると、これらの値の間に明らかに20%の違いがあります。

ここに画像の説明を入力してください

この記事は、%Committed Bytesメトリックが、マシンの物理メモリだけでなく、ページファイルのサイズを考慮に入れていることを示しています。これは、この値がタスクマネージャーの値よりも一貫して低い理由を説明します。

メトリックを使用してパーセンテージを計算する方が幸運かもしれませんがMemory \ Available Bytes、PerformanceCounterから物理メモリの合計量を取得する方法がわかりません。

于 2012-04-05T11:56:47.567 に答える
0

パフォーマンスモニターの下部にある「showdescription」を使用できます。引用するには

%Committed Bytes In Useは、Memory \CommittedBytesとMemory\CommitLimitの比率です。コミットされたメモリは、ディスクに書き込む必要がある場合にページングファイルにスペースが予約されている使用中の物理メモリです。コミット制限は、ページングファイルのサイズによって決まります。ページングファイルを拡大すると、コミット制限が増加し、比率が減少します)。このカウンターは、現在のパーセンテージ値のみを表示します。それは平均ではありません。

そうです、PMはページングファイルを使用しますが、TMは実際のRAMを使用します。

于 2014-01-04T22:27:36.813 に答える