進程的虛擬大小我有一個Delphi程序,我期待這是如何的程序可以在一個日誌文件打印了自己的「虛擬大小」,這樣我就可以看到它時使用了太多的內存。如何使用Delphi代碼來確定「虛擬大小」?確定用delphi
所謂「虛擬大小」我的意思的值由作爲Process Explorer顯示。普通任務管理器無法顯示此值。這不是程序的內存使用情況,而是地址空間使用情況。在Win32程序不能使用超過2 GB的地址空間。 PS:我正在使用Delphi 6,但其他版本的代碼/信息也應該沒問題。
進程的虛擬大小我有一個Delphi程序,我期待這是如何的程序可以在一個日誌文件打印了自己的「虛擬大小」,這樣我就可以看到它時使用了太多的內存。如何使用Delphi代碼來確定「虛擬大小」?確定用delphi
所謂「虛擬大小」我的意思的值由作爲Process Explorer顯示。普通任務管理器無法顯示此值。這不是程序的內存使用情況,而是地址空間使用情況。在Win32程序不能使用超過2 GB的地址空間。 PS:我正在使用Delphi 6,但其他版本的代碼/信息也應該沒問題。
由於這個post它可以提供關於怎樣用C/C++的虛擬大小的提示,我能寫出下面的德爾福功能:
Type
TMemoryStatusEx = packed record
dwLength: DWORD;
dwMemoryLoad: DWORD;
ullTotalPhys: Int64;
ullAvailPhys: Int64;
ullTotalPageFile: Int64;
ullAvailPageFile: Int64;
ullTotalVirtual: Int64;
ullAvailVirtual: Int64;
ullAvailExtendedVirtual: Int64;
end;
TGlobalMemoryStatusEx = function(var MSE: TMemoryStatusEx): LongBool; stdcall;
function VirtualSizeUsage: Int64;
var MSE: TMemoryStatusEx;
fnGlobalMemoryStatusEx: TGlobalMemoryStatusEx;
begin
Result := 0;
@fnGlobalMemoryStatusEx := GetProcAddress(GetModuleHandle(kernel32), 'GlobalMemoryStatusEx');
if Assigned(@fnGlobalMemoryStatusEx) then
begin
MSE.dwLength := SizeOf(MSE);
if fnGlobalMemoryStatusEx(MSE) then
Result := MSE.ullTotalVirtual-MSE.ullAvailVirtual;
end;
end;
它似乎能很好的完成我(德爾福6 ,Win XP)。有可能是使用GlobalMemoryStatus代替GlobalMemoryStatusEx一個更簡單的解決方案,但它不會正確的系統上有超過2 GB的內存工作。
+1哦,是的。對於你自己的過程,這是最好的方法。 –
的Process Explorer seems通過調用NtQueryInformation做到這一點,但它也可以使用性能數據,請參見GetProcessVirtualBytes
在我的答案here。
+1感謝您的快速回答。我還沒有嘗試過,因爲在此期間我找到了另一種方法來完成它,但它似乎是一個很好的解決方案。 – Name
@Name歡迎使用此方法,只有在查詢外部進程時才需要。正如我在對自己的答案發表評論時所說的,如果您只是在尋找有關您自己的流程的信息,那麼您的解決方案就是最好的解決方案。 –
對於那些已經依賴其他優秀Jedi Code Library的人,可以在JclWin32單位找到@Name正確指出的定義。
需要也爆發瞭如JclSysInfo單元各個功能的實際數字。只需撥打GetTotalVirtualMemory() - GetFreeVirtualMemory()來計算。
感謝您的回答。 – Name
在64位Windows上,使用LARGEADDRESSAWARE,32位進程可以使用4GB虛擬地址空間。在D6上,由於Borland MM中的錯誤,您需要切換MM(例如,轉到FastMM)以使其工作。 –