在Delphi中找到"非泄漏"内存使用问题的策略或工具?

Har*_*riv 10 delphi memory-management delphi-2006

一台旧应用程序在服务器更新后开始大量消耗内存.在程序挂起之前,内存使用似乎会超出限制.

根据FastMM4和EurekaLog,没有内存泄漏(28字节除外),所以我假设应用程序关闭时释放所有内存.

是否有适合跟踪此类内存问题的工具或策略?

da-*_*oft 8

  1. 不断增长的内存消耗是一个应用问题.它不是一个可以发现FastMM4或EurekaLog的bug.从他们的角度来看 - 应用程序只是正确地使用了内存.
  2. 使用AQTime,MemProof(很难找到,D7是最后支持的版本(?)),SleuthQA(类似于MemProof)或类似的内存分析器,您可以实时跟踪应用程序之外的内存使用情况.
  3. 使用FastMM4,GetMemoryManagerState/GetMemoryManagerUsageSummary,您可以跟踪应用程序的内存使用情况.将此信息输出到跟踪文件中并在运行后进行分析.或者为上述程序之一制作简单的包装函数,这将返回内存使用量.并从IDE Debugger Evalute/Modify调用它,添加到Watches或调用OutputDebugString,并查看当前的内存使用情况.

注意,如果某些DLL占用了内存,那么您可能无法使用(3)查看其内存使用情况.使用(2).

分析内存使用情况和应用程序执行的任务,您可能会发现导致内存使用量增加的原因.

  • MemProof(v.0.948,不确定这是最后一个)仍在Torry上:http://www.torry.net/authorsmore.php?id = 1229 (2认同)

mjn*_*mjn 8

自2012年9月以来,有一种非常简单和舒适的方法来查找此类"仅运行时"的内存泄漏.

FastMM4991引入了一种新方法,LogMemoryManagerStateToFile:

添加了LogMemoryManagerStateToFile调用.此调用将内存管理器状态的摘要记录到文件:已分配的内存总量,开销,效率以及按类和字符串类型分配的内存的细分.此调用可能有助于捕获不一定泄漏的对象,但确实会延迟时间.

要在运行时发现泄漏,您只需要执行这些步骤

  1. LogMemoryManagerStateToFile('memory.log', '')在一个间隔调用它的地方添加一个调用
  2. 运行应用程序
  3. 使用尾程序(例如BareTail)打开日志文件,该程序将在文件内容更改时自动刷新
  4. 观察文件的第一行,它们将包含占用最大内存量的内存分配
  5. 如果你看到一个类或内存类型不断有越来越多的实例,这可能是你泄漏的原因