获取进程的可用内存

Get available memory for a process

我用的是Delphi2007,所以可用内存有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。如果需要更多,OS 开始将内存交换到磁盘。

进程可用内存 - 可执行文件和 Windows 的限制。现在大多数 Windows 是 64 位的,所以这不是问题。但是如果可执行文件被编译为 32 位 IMAGE_FILE_LARGE_ADDRESS_AWARE,限制应该是 3 GB,对吗?当可执行文件是 64 位时,它会大得多,可能是 64 GB(但如果安装的 RAM 较少,则可能会发生交换......)。

所以我的问题是,如何获取进程的可用内存?

您可以做一些显而易见的事情。调用 GetSystemInfo and subtract lpMinimumApplicationAddress from lpMaximumApplicationAddress 以查找您的进程可用的地址数量 space。

您可用的物理内存量更难获得,并且不是固定数量。为此,您正在与所有其他流程竞争,因此这是一个非常流畅和动态的概念。您可以通过调用 GlobalMemoryStatusEx 来了解系统上有多少物理内存可用。 returns 还有其他信息,但很容易误解它。事实上,API 还会告诉您有多少虚拟内存可用于您的进程,这会为您提供与第一段中相同的信息。

也许你想要的是总物理内存和总虚拟内存中的最小值。但我不想说。我见过许多代码示例,这些代码通过根据误解的内存统计信息做出错误的决定来不必要地限制其执行能力。