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

在寻找内存泄漏方面,我一直在使用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”的位置。

那么这是什么意思?


Delphi的FastMM内存管理器在Windows内存系统之上工作。 它使用VirtualAlloc从操作系统分配大块内存,然后将其分成更小的块,供程序使用。 如果你释放了大量的内存,它会将一些内存回给操作系统。 但是,如果你释放少量的内存,它很可能会持续下去,因为你可能很快就会需要它。 这是FastMM速度的一部分,它不是内存泄漏。

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

链接地址: http://www.djcxy.com/p/35053.html

上一篇: Why is my program leaking Virtual Memory?

下一篇: Tracking threads memory and CPU consumption