2012-11-19 60 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