我使用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较少,则可能会发生交换......)。
所以我的问题是,如何获得进程的可用内存?
答案 0 :(得分:1)
你可以做一些显而易见的事情。致电GetSystemInfo
并从lpMinimumApplicationAddress
中减去lpMaximumApplicationAddress
,以查找您的流程可用的地址空间量。
您可用的物理内存量更难获得,并且不是固定数量。您正在与所有其他流程竞争,因此这是一个非常流畅和动态的概念。您可以通过调用GlobalMemoryStatusEx
了解系统上可用的物理内存量。这也会返回其他信息,但很容易误解它。事实上,这个API还会告诉您可以为您的进程提供多少虚拟内存,这将为您提供与第一段相同的信息。
也许你想要的是物理和总虚拟内存的最小值。但我不想说。我已经看到许多代码示例,这些代码通过基于错误解释的内存统计信息做出错误决策而不必要地限制其执行能力。