2012-11-19 28 views
3

我正在查找以获取MB中使用的当前数量物理内存。像在任务管理器以兆字节获取物理内存使用情况

enter image description here

什么我当前使用PerformanceCounter("Memory", "Available MBytes", true);但其还包括页面文件(我相信)这不是我想要的。另外我想要选择使用而不是可用内存。

我正在使用的应用程序将监视物理内存使用情况,直到达到所需的阈值。然后它会重新启动一些Windows服务。

如果你对我为什么开发这样的程序感到好奇。我们的一些程序在服务器上存在内存泄漏,我们必须重新启动Windows服务才能释放内存,直到我们清理出所有内存泄漏,然后我使这个应用程序帮助保持服务器正常运行,并且响应。

回答

5

使用PerformanceCounter class,你可以得到PF使用率细节:

PerformanceCounter pageCounter = new PerformanceCounter 
      ("Paging File", "% Usage", "_Total", machineName); 

你可以在这里找到所有的分类信息,Process Object

ADDED,你还可以得到可用内存细节使用PerformanceCounter

PerformanceCounter ramCounter = PerformanceCounter 
      ("Memory", "Available MBytes", String.Empty, machineName); 

使用PerformanceCounterNextValue()方法,你可以在MB得到可用内存值,以后你可以用它比较阈值值停止所需的Windows服务

if (ramCounter.NextValue() > thresholdValue) 
{ 
    // ... Stop Desired Services 
} 

参考:A Simple Performance Counter Application

+0

我目前使用'PerformanceCounter ramCounter = new PerformanceCounter(“Memory”,“Available MBytes”,String.Empty,machineName);'但是这并没有给我使用的物理内存,只有可用的内存。它似乎包括页面文件,这是我不想要的。 – ZioN

+0

实际上,您需要使用'新的PerformanceCounter(“分页文件”,“%Usage”,“_Total”,machineName);'而不是检查可用内存。由于您需要* PF Usage *细节,因此请尝试使用PerformanceCounter类。 –

+0

是的,我能理解你说的是真的。但是,如果我们在服务器上拥有6GB内存,并且阈值设置为4.5GB,那么该怎么办?这意味着我必须设置我的应用程序,以检查何时有1.5GB可用,它不会启动进程当TM显示的内存为4.5GB时,重新启动Windows服务? – ZioN

2

如果您不介意调用内核函数。 C++代码来做到这一点是:

MEMORYSTATUSEX statex; 
statex.dwLength = sizeof (statex); 
GlobalMemoryStatusEx (&statex); 

CodeProject上,你可以找到如何调用从C#中的内核函数:

http://www.codeproject.com/Articles/1285/Calling-API-functions-using-C

+0

http://www.pinvoke.net/default.aspx/kernel32.globalmemorystatusex的的P/Invoke签名为你做:) – Lloyd