簡體   English   中英

如何確定進程“虛擬大小”(WinXP)?

[英]How to determine a process “virtual size” (WinXP)?

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

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

如何確定“當前進程”的查詢字符串,是否有非本地化名稱?

根據MSDN:內存性能信息 PROCESS_MEMORY_COUNTERS_EX.PrivateUsage與Windows XP中任務管理器中的VM大小相同。 GetProcessMemoryInfo應該工作:

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

現在pmcx.PrivateUsage保存進程的VM Size。

我需要與theller相同的東西,但遺憾的是它需要它來進行我自己以外的過程。 因此,由於GlobalMemoryStatusEx()(返回MEMORYSTATUXEX的函數)僅適用於當前進程,因此使用“MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual”的自我回答並不適合我。

到目前為止,如果不使用性能計數器,我一直無法找到我想要的東西(我沒有進入那些因為它們看起來比我想要的更復雜)。 我通過循環並使用“VirtualQueryEx”來探索所需進程的地址空間,計算所有沒有狀態MEM_FREE的區域。 在我的測試中,與Process Explorer相比,它似乎比我預期的高17M。 ......而且,它肯定不是無競爭條件的。

無論如何,我知道這不是一個非答案,但我想我至少會記錄我為此做出的進展,無論誰發現了下一個。

您查詢性能計數器。
在win32 API中有一個完整的API, 請在此處閱讀
如果運行名為“perfmon.exe”的程序,可以查看所有性能計數器

您可以使用性能計數器。 Process Object具有“Virtual Bytes”值。

在32位WindowsXP地址空間分為兩個2GB部分:一部分用於程序,另一部分用於內核。 您可以使用boot.ini文件中/ 3GB開關將應用程序部分增加到3GB。

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

請參閱win32組新聞://nntp.aioe.org/comp.os.ms-windows.programmer.win32獲取C代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM