我创建了一个的PerformanceCounter,可以检查在%的总内存使用量,但问题是,它并没有给我相同的值,在任务管理器显示我。 例如:我的程序说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) + "%";
编辑
我刷新进度和标签每一秒的计时器。
你可以使用GetPerformanceInfo窗口API,它显示在Windows 7完全一样的Windows任务管理器相同的值,这里是控制台应用程序,得到的可用物理内存,你可以很容易地拿到GetPerformanceInfo收益等信息,请参阅MSDN PERFORMANCE_INFORMATION结构文档,看看如何在MIB来计算价值,基本上所有SIZE_T值是网页,所以你必须用每页相乘。
更新:我更新了这个代码来显示百分比,因为它调用GetPerformanceInfo两次它不是最优的,但我希望你的想法。
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;
}
}
}
}
我想,通过任务管理器所报告的物理内存的百分比实际上是一个不同的度量与% Committed Bytes In Use
你的PerformanceCounter使用。
在我的机器有性能监视器观察,这些值之间存在明显的20%的差异:
这篇文章表明,内存比例的度量采用了页面文件的大小考虑,而不仅仅是机器的物理内存。 这可以解释为什么这个值比任务管理器的值始终较低。
您可能有更好的运气用计算百分比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;
}
您可以使用性能监视器底部的“显示说明”。 报价
%提交字节在使用中被内存\提交字节的到存储\提交限制的比率。 提交的内存在使用中的物理内存空间,这已在分页文件中保留它应该需要被写入磁盘。 提交限制由分页文件的大小来确定。 如果寻呼文件被放大,提交限制增加,并且比减小)。 此计数器仅显示当前的百分比值; 它不是一个平均值。
洙是PM使用分页文件,而TM使用实际RAM。