2009-02-14 41 views
10

我有一個需要大量內存的程序,只要達到2GB的虛擬地址空間就會崩潰。 Sysinternals進程管理器將其顯示爲「虛擬大小」列。如何用C(或C++)代碼確定這個「虛擬大小」?如何確定一個進程「虛擬大小」(WinXP)?

好吧,我必須查詢「虛擬字節」的性能計數器。 Perfmon在我的德語Win XP安裝中顯示查詢字符串(或其調用方式),例如'\ Process(firefox)\ VirtuelleGröße'。

如何確定'當前進程'的查詢字符串,並且是否存在非本地化名稱?

回答

8

根據MSDN: Memory Performance InformationPROCESS_MEMORY_COUNTERS_EX.PrivateUsage與Windows XP中任務管理器中的虛擬機大小相同。 GetProcessMemoryInfo應該工作:

PROCESS_MEMORY_COUNTERS_EX pmcx = {}; 
pmcx.cb = sizeof(pmcx); 
GetProcessMemoryInfo(GetCurrentProcess(), 
    reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&pmcx), pmcx.cb); 

現在pmcx.PrivateUsage保持處理的VM大小。

+0

我想這將是什麼ProcessExplorer顯示在'私人字節'列,所以它不是我在找什麼。 – theller 2009-02-14 10:28:31

1

您查詢性能計數器。
在win32 API中有一個完整的API,read about it here
如果您運行名爲'perfmon.exe'的程序,您可以查看所有性能計數器。

+0

您沒有代碼片段嗎? – theller 2009-02-14 09:28:36

1

您可以使用性能計數器。 Process對象具有「虛擬字節」值。

+1

IIUC,GetProcessMemoryInfo不提供*此*信息。 – theller 2009-02-14 09:29:59

+0

你是對的。糾正。 – 2009-02-14 09:43:46

0

在32位WindowsXP地址空間被分成兩個2GB部分:一部分用於程序,另一部分用於內核。您可以使用/3GB switch in the boot.ini file將應用程序部分增加到3GB。

+0

我知道。問題是,我距離極限還有多遠。 – theller 2009-02-14 09:29:16

0

您不需要性能計數器。 只需使用NAPI(Win32的FAQ)

看到的Win32集團新聞://nntp.aioe.org/comp.os.ms-windows.programmer.win32 的C代碼。

1

我需要和勒姆一樣的東西,但不幸的是我需要它以外的其他過程。因此,由於GlobalMemoryStatusEx()(返回MEMORYSTATUXEX的函數)僅適用於當前進程,因此使用「MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual」的自我回答不適用於我。

到目前爲止,我一直無法找到我正在尋找的東西,而沒有使用性能計數器(我沒有涉及這些因爲他們看起來比我所尋找的方式更復雜)。通過循環使用「VirtualQueryEx」來探索所需進程的地址空間,將所有沒有MEM_FREE狀態的區域計算在內,我非常接近。在我的測試中,它比我比預期的Process Explorer高出17M。 ......而且,這當然不是無競賽條件的。

無論如何,我知道這是一個無法回答的問題,但我想我至少會記錄下我在這方面取得的進展。