2015-04-01 129 views
13

好的,我使用WMI(.net/C#)不斷收集有關機器上運行的特定進程的數據。我通過Win32_PerfFormattedData_PerfProc_Process類獲得數據。這類有很多的屬性,但那些我們感興趣的是如下:如何計算任務管理器的內存使用情況?

uint64 PageFileBytes; 

值,以字節爲單位,這個過程已經在分頁文件(S)使用。分頁文件存儲進程使用的未包含在其他文件中的內存頁面。分頁文件由所有進程共享,分頁文件中缺少空間可阻止其他進程分配內存。

uint32 PoolNonpagedBytes; 

值,以字節爲單位,在非分頁池,系統存儲器(由操作系統使用的物理存儲器),選擇那些不能被寫入到磁盤的對象的區域,但必須只要保持在物理存儲器中,因爲它們被分配。 Win32_PerfFormattedData_PerfOS_Memory中的PoolNonpagedBytes與Win32_PerfFormattedData_PerfProc_Process中的PoolPagedBytes屬性計算方式不同,因此它可能不等於Win32_PerfFormattedData_PerfProc_Process的所有實例的PoolPagedBytes總數。該屬性僅顯示最後一個觀察值;這不是一個平均值。

uint32 PoolPagedBytes; 

值,以字節爲單位,在分頁池,當它們不被用於可寫入磁盤的對象的系統存儲器(由操作系統使用的物理存儲器)的一個區域。 Win32_PerfFormattedData_PerfOS_Memory中的PoolNonpagedBytes屬性的計算方式與Win32_PerfFormattedData_PerfProc_Process中的PoolPagedBytes屬性不同,因此它可能不等於Win32_PerfFormattedData_PerfProc_Process的所有實例的PoolPagedBytes總數。該屬性僅顯示最後一個觀察值;這不是一個平均值。

uint64 PrivateBytes; 

此進程分配的當前值(以字節爲單位),不能與其他進程共享。

uint64 VirtualBytes; 

電流的大小,以字節爲單位的虛擬地址空間,該方法是使用。使用虛擬地址空間不一定意味着相應使用磁盤或主內存頁面。虛擬空間是有限的,通過使用太多,這個過程可能會限制其加載庫的能力。

uint64 WorkingSet; 

該進程的工作集在任何時間點的最大數量(以字節爲單位)。工作集是進程中線程最近觸及的一組內存頁面。如果計算機中的可用內存超過閾值,即使它們未被使用,頁面也會留在進程的工作集中。當空閒內存低於閾值時,頁面將從工作集中刪除。如果需要它們,則在它們離開主存之前,它們被軟件故障重新放入工作集。

我目前使用WorkingSet字段來報告進程的內存使用情況。但是,這與任務管理器顯示的內容不一致。我嘗試了PrivateBytes,但這也不是「正確的」。應用程序監視的進程是一個.NET進程(如果這很重要),並且應用程序報告它將使用至少比任務管理器同時顯示的內存多100MB的內存。

所以問題是什麼是「公式」來計算過程的內存使用情況的最佳近似值,如任務管理器所示?

enter image description here

回答

3

Win32_PerfFormattedData_PerfProc_Process是正確的類。它從中拉出的財產是WorkingSetPrivate。沒有公式/計算需要。