【问题标题】:Get available memory for a process获取进程的可用内存
【发布时间】:2016-10-18 06:29:11
【问题描述】:

我使用的是 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 位的,所以这不是问题。但如果可执行文件使用IMAGE_FILE_LARGE_ADDRESS_AWARE 编译为 32 位,则限制应该是 3 GB,对吧?当可执行文件是 64 位时,它会更大,可能是 64 GB(但如果安装的 RAM 较少,则可能会发生交换......)。

所以我的问题是,我怎样才能获得进程的可用内存?

【问题讨论】:

  • 请定义可用内存。您的进程可以使用 64 位系统上的全部 4gb 地址空间。它能够分配所有当前未保留、给予或接受的空间。无论如何,您将如何处理这些信息。
  • 我试图澄清这个问题
  • 所以这是您想要的地址空间量。它是 2、3 或 4。不太可能是 3。这些天你不会发现很多使用 /3gb 开关启动的 32 位系统。
  • 好吧,你是对的。在某种程度上,我认为该过程有 3 GB 可用。但是当我测试时,我设法获得了 3,85 GB。所以 4 GB 是极限。太好了!
  • 在 32 位系统上它仍然是 2GB,但它们现在非常罕见

标签: delphi delphi-2007


【解决方案1】:

您可以做一些显而易见的事情。调用GetSystemInfo 并从lpMaximumApplicationAddress 中减去lpMinimumApplicationAddress 以找到您的进程可用的地址空间量。

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

也许您想要的是总物理内存和总虚拟内存中的最小值。但我不想说。我见过许多代码示例,它们通过基于误解的内存统计数据做出错误的决定,不必要地限制了其执行能力。

【讨论】:

  • 不应该是lpMaximumApplicationAddress吗?
猜你喜欢
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 2012-03-23
  • 1970-01-01
  • 2018-05-15
相关资源
最近更新 更多