2011-11-16 39 views
6

進程的虛擬大小我有一個Delphi程序,我期待這是如何的程序可以在一個日誌文件打印了自己的「虛擬大小」,這樣我就可以看到它時使用了太多的內存。如何使用Delphi代碼來確定「虛擬大小」?確定用delphi

所謂「虛擬大小」我的意思的值由作爲Process Explorer顯示。普通任務管理器無法顯示此值。這不是程序的內存使用情況,而是地址空間使用情況。在Win32程序不能使用超過2 GB的地址空間。 PS:我正在使用Delphi 6,但其他版本的代碼/信息也應該沒問題。

+0

在64位Windows上,使用LARGEADDRESSAWARE,32位進程可以使用4GB虛擬地址空間。在D6上,由於Borland MM中的錯誤,您需要切換MM(例如,轉到FastMM)以使其工作。 –

回答

10

由於這個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的內存工作。

+0

+1哦,是的。對於你自己的過程,這是最好的方法。 –

6

的Process Explorer seems通過調用NtQueryInformation做到這一點,但它也可以使用性能數據,請參見GetProcessVirtualBytes在我的答案here

+0

+1感謝您的快速回答。我還沒有嘗試過,因爲在此期間我找到了另一種方法來完成它,但它似乎是一個很好的解決方案。 – Name

+0

@Name歡迎使用此方法,只有在查詢外部進程時才需要。正如我在對自己的答案發表評論時所說的,如果您只是在尋找有關您自己的流程的信息,那麼您的解決方案就是最好的解決方案。 –

1

對於那些已經依賴其他優秀Jedi Code Library的人,可以在JclWin32單位找到@Name正確指出的定義。

需要也爆發瞭如JclSysInfo單元各個功能的實際數字。只需撥打GetTotalVirtualMemory() - GetFreeVirtualMemory()來計算。

+0

感謝您的回答。 – Name