【问题标题】:Why is my program leaking Virtual Memory?为什么我的程序会泄漏虚拟内存?
【发布时间】:2011-07-17 11:32:40
【问题描述】:

为了寻找内存泄漏,我一直在使用 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”处。

那么,这是什么意思?

【问题讨论】:

  • VirtualAlloc 是调用系统分配内存的函数。如果您停止调用 VirtualAlloc,您将不会泄漏内存。您也无法进行动态分配。不是很有用。我简直无法理解您为什么不使用告诉您泄漏位置的工具。
  • David 没有在我的源文件中调用 VirtualAlloc。该程序没有直接调用 VirtualAlloc。它被隐式调用。顺便说一句,我会在上一个问题中提出这个问题,尽管它与这个问题有关,但它并不相同。我特意询问 VirtualAlloc。
  • @user FastMM 在您向 FastMM 请求内存并且它需要系统提供更多内存时代表您调用 VirtualAlloc。我认为你应该听从 Mason 的建议。

标签: delphi memory virtual memory-leaks


【解决方案1】:

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

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

【讨论】:

  • @David 和@Mason FastMM4 肯定需要一些时间来适应,因为它的用户界面(日志文件)非常神秘且有些吓人(如果我可以这么说的话)。但是,在运行我的软件后,我花了一些时间查看日志文件,并且在我的源文件中发现了各种泄漏。其中一些是显而易见的,但被忽视了。感谢您的帮助。
  • @user 我同意它吐出很多东西。但这对于难以追踪的泄漏通常是必不可少的。当你有很多泄漏时,它会令人生畏。我相信你现在也可以接受昨天问题的答案了!!!
  • 有关如何启用 FastMM4 的完整详细信息,请参阅此答案:stackoverflow.com/questions/1130454/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 2012-05-21
  • 2017-07-01
相关资源
最近更新 更多