3

我的 Delphi XE 应用程序基于使用 RemObjects 创建的本地服务器 DLL 的单个 EXE,并为特定操作使用大量内存,直到它生成一个异常说没有足够的内存。因此,我试图了解发生这种情况的原因和位置,因此我在代码中放置了各种步骤,报告内存使用情况。问题是,根据用于获取内存使用信息的方法,我得到的信息非常不同:

  1. 如果我使用这里解释的方法,直接向 FastMM 询问客户端 EXE 和服务器 DLL,我得到的是:

    • 第 1 步:[客户端] = 36664572 - [服务器] = 3274976
    • 第 2 步:[客户端] = 62641230 - [服务器] = 44430224
    • 第 3 步:[客户端] = 66665630 - [服务器] = 44430224
  2. 现在,如果我使用这里解释的使用 GetProcessMemoryInfo 的方法,我会得到更多的内存使用:

    • 第 1 步:[流程] = 133722112
    • 第 2 步:[流程] = 1072115712
    • 第 3 步:[流程] = 1075818496

根据我的记忆问题,看起来第二种方法是正确的,但 FastMM 方法怎么会如此“低”?什么可以解释差异?

4

1 回答 1

5

GetProcessMemoryInfo 还报告不由 FastMM 管理的内存,例如由您可能调用的各种非 Delphi dll(如 winapi)分配的内存。

此外,FastMM 可以从 Windows 分配更多内存,您的应用程序实际用于内部结构、碎片和池。

最后,您可以使用 GetProcessMemoryInfo 测量工作集的大小。那就是应用程序内存的一部分当前在 RAM 中,而不是在页面文件中。它不仅包括数据结构,而且绝对不能与应用程序分配的总内存相提并论。PagefileUsage 将更具可比性。工作集大小几乎从来都不是您想要的。请参阅此处以获得更好的解释。

所以他们都给出了不同的结果,因为他们都测量了不同的东西。

于 2012-03-14T15:52:49.777 回答