【发布时间】: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