为什么我的程序泄漏了虚拟内存?

时间:2011-03-17 14:54:56

标签: delphi memory virtual memory-leaks

为了寻找内存泄漏,我一直在使用MemProof,并且能够查看正在使用,创建和销毁的资源的实时计数。运行我的程序超过一天半之后,我注意到其他所有内容都不变或更少,虚拟内存(VM)的数量正在增加。它起始于109,现在是24小时后的113.

这就是MemProof对每个VM泄漏所说的内容:

VirtualAlloc(address_location,16384,4096,4);它被标识为虚拟内存,其大小始终为16384.API名称为VirtualAlloc。该模块是kernel32.dll。

此外,memproof说,“virtualalloc在调用进程的虚拟地址空间中保留或提交页面区域。当不再需要时,必须使用virtualFree释放已分配的页面。”

VM泄漏与文件System.Pas中的函数相关联。

功能如下:

function GetCmdShow: Integer;
var
  SI: TStartupInfo;
begin
  Result := 10;                  { SW_SHOWDEFAULT }
  GetStartupInfo(SI);
  if SI.dwFlags and 1 <> 0 then  { STARTF_USESHOWWINDOW }
    Result := SI.wShowWindow;   
end;  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

当我点击虚拟内存泄漏时,Memproof指示关键词“end”的指示不足。

那么,这是什么意思?

1 个答案:

答案 0 :(得分:5)

Delphi的FastMM内存管理器在Windows内存系统之上运行。它使用VirtualAlloc从操作系统中分配大块内存,然后将其分成较小的块以供程序使用。如果你释放了大量内存,它会将一些内存返回给操作系统。但是,如果您释放少量内存,它可能会保留它,因为您可能很快就会再次需要它。这是使FastMM快速运行的一部分,而且它不是内存泄漏。

任何只监视VirtualAlloc并且实际上并不关注FastMM正在做什么的内存分析器会给你带来无意义的结果。正如David在评论中提到的,如果你想追踪真正的内存泄漏,你需要使用FastMM工具。从SourceForge下载FastMM的完整版本并阅读文档以了解如何启用FullDebugMode以及泄漏报告和日志记录,并且您将有更轻松的时间。