2016-10-18 32 views
0

我使用Delphi 2007,因此存在32位的可用內存限制。爲進程獲取可用內存

使用IMAGE_FILE_LARGE_ADDRESS_AWARE PE標誌,應該有一個3 GB的限制,而不是2 GB:

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} // Allows usage of more than 2GB memory 

這是我用來獲取進程的當前內存使用方法:

function MemoryUsed: Int64; 
var 
    PMC: _PROCESS_MEMORY_COUNTERS_EX; 
begin 
    Win32Check(GetProcessMemoryInfo(GetCurrentProcess, @PMC, SizeOf(PMC))); 
    Result := PMC.PrivateBytes; 
end; 

現在我想要一種方法來獲取進程可用內存的總量。它應該在3 GB左右。但我不想對它進行硬編碼,因爲將來我們會轉向新的Delphi和64位。

我應該使用什麼樣的Win32 API函數?

可用內存 - 計算機可用內存 - 可能安裝了8 GB RAM。如果需要更多內存,操作系統將開始將內存交換到磁盤。

進程可用內存 - 可執行文件和Windows中的限制。現在大多數Windows是64位的,所以這不是問題。但是,如果可執行文件被編譯爲32位,並且IMAGE_FILE_LARGE_ADDRESS_AWARE,則限制應爲3 GB,對不對?當可執行文件是64位時,它會更大,也許64 GB(但如果安裝的RAM更少,則可能會發生交換)。

所以我的問題是,我如何獲得進程的可用內存?

+1

請定義可用內存。您的進程可以使用64位系統上的完整4GB地址空間。它能夠分配當前未保留的所有空間,給予或帶走。無論如何,你將如何處理這些信息。 –

+0

我試圖澄清問題 –

+0

所以這是你想要的地址空間量。它可能是2,3或4.非常不可能是3.您現在不會發現許多使用/ 3gb開關引導的32位系統。 –

回答

1

有幾件你可以做的明顯事情。致電GetSystemInfo並從lpMaximumApplicationAddress中減去lpMinimumApplicationAddress以查找可用於您的進程的地址空間量。

可用於您的物理內存量很難獲得,而且不是固定數量。您正在與所有其他流程競爭,所以這是一個非常流暢和動態的概念。通過調用GlobalMemoryStatusEx可以找出系統上有多少物理內存。這也會返回其他信息,但很容易誤解它。實際上,這個API也會告訴你有多少虛擬內存可用於你的進程,這會給你提供與第一段相同的信息。

也許你想要的是總物理和虛擬內存的最小值。但我不想說。我見過很多代碼示例,它們根據誤解的內存統計信息做出不好的決定,從而不必要地限制了它的執行能力。

+0

它應該不是lpMaximumApplicationAddress? – Fritzw