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

时间:2011-10-18 11:09:30

标签: delphi memory-management delphi-2006

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

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

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

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:8)

自2012年9月以来,有一种非常简单而舒适的方法可以找到这种“仅限运行时”的内存泄漏。

FastMM4991引入了一种新方法LogMemoryManagerStateToFile

  

添加了LogMemoryManagerStateToFile调用。此调用记录了摘要   内存管理器状态到文件:总分配内存,开销,   效率,按类和字符串类型划分分配的内存。   此调用可能有助于捕获不一定泄漏的对象,但是   徘徊的时间比他们应该的长。

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

  1. LogMemoryManagerStateToFile('memory.log', '')的某个地方添加对{<1}}的调用
  2. 运行应用程序
  3. 使用尾程序打开日志文件(例如BareTail),当文件内容发生变化时会自动刷新
  4. 观察文件的第一行,它们将包含占用最大内存量的内存分配
  5. 如果您发现某个类或内存类型的实例越来越多,这可能是您泄漏的原因

答案 2 :(得分:2)

AQTime(一种非常昂贵的商业工具)可以报告您的内存使用情况,直到分配每个对象的源代码行。在内存使用情况非常大的情况下,您可能需要AQTime功能,该功能可以显示每个对象的对象数和大小(总计加上单个实例大小)。 AQTime对我很有用,从Delphi 7开始,以及所有更高版本,包括你的版本(2006)和最新版本(XE和XE2)。

随着程序内存使用量的增加,AQTime可用于获取运行时堆的“快照”,您可以用它来了解应用程序的内存使用情况;正在创建什么,以及每个对象存在多少。即使没有泄漏,了解应用程序在创建和管理的对象方面的运行时行为也非常重要,而AQTime是我所知道的Delphi用户最强大的工具。

如果您愿意升级到Delphi XE / XE2,您可能已经包含了AQTime的简易版本,如果是这样,请查看它。如果没有,我建议你试试他们的演示。我不知道任何可以提供相同功能的免费或开源替代品。

通过编写大量跟踪消息或使用FastMM完全调试模式,可以手动拼凑较少的功能。如果您可以将内存使用量的完整转储写入一个非常大的文件,那么您可以编写一些工具来解析,并创建摘要。在这种情况下,我在FastMM中遇到的问题是,您将被淹没在详细信息中,而无法准确提取有助于您了解情况的摘要信息。因此,您可以尝试编写自己的工具来总结内存使用情况。在一个应用程序中我使用了一系列我知道会使用大量内存的组件,我在我的应用程序中写了一个对话框,显示了这些大型内存blob-of-data对象的当前内存使用情况。

答案 3 :(得分:0)

你有没有想过导致IDE的泄漏...它是如此巨大!!!

在我的情况下(2GB内存)我会做下一个...... 1.打开IDE 2.将它最小化近六个小时 3.了解如何使用物理内存

结果: 虽然IDE是oppened(记住我也做了最小化的测试),它正在获得越来越多的RAM ...直到没有更多的RAM免费。 它获得所有2GB RAM +所有页面文件硬盘空间(我将它配置为4GB的mas) 在不到六个小时内(在IDE上什么都不做)它尝试使用超过6GB。

这被称为IDE导致的内存泄漏...我不在IDE上键入任何字母,不编译任何内容,甚至不打开任何项目...只需打开IDE并最小化它...离开计算机上没有做任何事情大约六个小时,IDE耗费了6GB的内存。

当然,在那之后,IDE会以恼人的SystemOutOfMemory消息开始......我必须杀掉它...然后释放所有6GB的消息!!!

什么时候会在地狱中修复?

请注意我已经应用了所有补丁,我还测试了没有应用每个补丁/修补程序等...

我得到的最好的是禁用工具上的一些选项,比如强调坏代码的那些选项......等等,为什么地狱那个选项有任何影响......我没有在IDE上输入任何东西(在测试)...如果我感到不适,那么内存泄漏会减少很多......

当然,如果我使用IDE(在打开的项目上编写代码),甚至没有编译/运行它...事情变得更糟......在不到一个小时的时间内就可以达到6GB的内存泄漏,有时会在复制/粘贴源代码15分钟后发生。

似乎在短时间内没有解决方案!!!

所以我得到了下一个完美的解决方案: - 关闭IDE,每15分钟或更短时间重新打开它

丑陋的解决方案,我知道......但是有效!