在Delphi App中监视内存使用情况

Cob*_*ger 8 delphi monitoring memory-leaks

我从一个离开公司的程序员那里继承了一个非常大的子系统,并且第一个业务是阻止进程耗尽内存.

基本上,它是一个循环数据集,在其中我们创建和销毁一个关闭并完成大量工作的数据模块.只要创建了这个数据模块,您就可以在任务管理器中看到内存使用一直在攀升,直到它爆炸为止.我似乎从几年前读过的一篇文章中回忆起,人们不应完全信任任务管理器报告的内容,因为这些值是估计而非实时.所以我在寻找其他选择.

这是我尝试过的:

  1. ReportMemoryLeaksOnShutdown:=在我的主项目文件中为True,但它什么都不返回.因此要么它不监视在动态加载的包中泄漏的内存,要么在应用程序关闭之前释放内存.
  2. AQTime.这应该是一个非常令人惊叹的产品,但我发现它完全没有给人留下深刻印象.如果我使用分配探查器,我最终得到的数百行没有任何用处.只是一个内存地址,大小和"VCL标准分配"的内容.它应该按惯例分解信息,但我只是得到一个没有例行信息的平面列表.所以我认为它不起作用.

是否有其他工具可以帮助我跟踪分配和释放内存的位置?我一直在评论各处的一些功能,以查看问题消失的地方,并检查显式分配的所有内容是否被释放,但我仍然有泄漏,这可能是一个非常令人沮丧的过程.

mjn*_*mjn 11

FastMM包含一个简单的GUI,可在应用程序运行时显示内存使用情况.

示例项目位于Demos/Usage Tracker目录中.

  • +1您可以将该使用跟踪器表单包含在您自己的项目中,我将向您展示您不断更新的内存的实时图形表示.很简约.我通常在`{$ IFDEF DEBUG} .. {$ ENDIF}`之间包含它,所以它只包含在我的调试版本中. (4认同)

War*_* P 3

我绝对会使用 AQTime,而不是其他任何东西来确定内存使用信息。以下是我希望您能找到的内存使用信息的示例:

  1. 使用 GetMem、TObject.Create 分配内存的精确行。
  2. 各种类类型使用的对象计数和总内存的良好计数器。

首先,让我们把显而易见的事情抛开:

答:您必须遵循 AQTime 的说明并设置项目设置,包括编译器和链接器设置,如帮助文件中详细记录的那样。特别是,您需要在链接器选项中使用 Turbo Debugger (TD32) 符号,以及为项目的任何其他调试版本设置的所有其他选项设置。

B. 在将其用于您自己的应用程序之前,您应该先尝试教程。

简而言之,我大量使用AQTime,当我遇到问题时,它们都是可以解决的,所以不要放弃AQTime。如果您无法让大型应用程序运行,请首先学习如何测试小型应用程序、演示或教程练习。

更新:我刚刚亲自测试过它,我发现我什至无法按照描述的方式使用分配分析器进行 AQTime 7 的基本演示。我使用的是 AQTime 7.10.380 专业版。