我的Delphi XE应用程序基于一个EXE,使用RemObjects创建的本地服务器DLL,并为特定操作使用大量内存,直到它生成一个表示内存不足的异常。因此,我试图理解为什么以及在哪里发生这种情况,所以我在代码中放置了各种步骤来报告内存使用情况。问题是,根据用于获取内存使用信息的方法,我得到的信息非常不同:
-
如果我使用这里解释的方法,直接向FastMM询问客户端EXE和服务器DLL,我得到的是:
- 第1步:[客户端]=36664572-[服务器]=3274976
- 第2步:[客户端]=6264230-[服务器]=44430224
- 第三步:[客户端]=66665630-[服务器]=444430224
-
现在,如果我使用这里解释的使用GetProcessMemoryInfo的方法,我会得到更多的内存使用:
- 步骤1:[过程]=133722112
- 步骤2:[过程]=1072115712
- 步骤3:[过程]=1075818496
基于我的内存问题,第二种方法似乎是正确的,但FastMM方法怎么会这么"低"呢?什么可以解释这种差异?
GetProcessMemoryInfo还报告不由FastMM管理的内存,比如由您可能调用的各种非Delphi dll分配的内存(比如winapi)。
此外,FastMM可以从Windows中分配更多的内存,这些内存实际上用于内部结构、碎片和池。
最后,使用GetProcessMemoryInfo测量Workingset大小。如果在页面文件中,这就是应用程序内存当前在RAM中的部分。它不仅仅包括数据结构,而且与应用程序分配的总内存不可比。PagefileUsage将更具可比性。工作集大小几乎从来都不是你想要的。请参阅此处以获得更好的解释。
所以他们都给出了不同的结果,因为他们都测量了不同的东西。