寻找的策略或工具;“无泄漏”;Delphi中的内存使用问题?

寻找的策略或工具;“无泄漏”;Delphi中的内存使用问题?,delphi,memory-management,delphi-2006,Delphi,Memory Management,Delphi 2006,一个旧的应用程序在服务器更新后开始大量消耗内存。在程序挂起之前,内存使用似乎会超出限制 根据FastMM4和EurekaLog,并没有内存泄漏(28字节除外),所以我假设当应用程序关闭时,所有内存都被释放 有没有适合追踪这种记忆问题的工具或策略 不断增长的内存消耗是一个应用程序问题。它不是一个可以发现FastMM4或EurekaLog的bug。从他们的角度来看,应用程序只是正确地使用内存 使用AQTime、MemProof(很难找到,D7是最新支持的版本(?)、SleuthQA(类似于MemPr

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

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

有没有适合追踪这种记忆问题的工具或策略

  • 不断增长的内存消耗是一个应用程序问题。它不是一个可以发现FastMM4或EurekaLog的bug。从他们的角度来看,应用程序只是正确地使用内存
  • 使用AQTime、MemProof(很难找到,D7是最新支持的版本(?)、SleuthQA(类似于MemProof)或类似的内存分析器,您可以实时跟踪应用程序外部的内存使用情况
  • 使用FastMM4,getMemoryManager状态/getMemoryManager页面摘要,您可以从应用程序跟踪内存使用情况。将此信息输出到跟踪文件中,并在运行后对其进行分析。或者为上述过程之一创建简单的包装函数,该函数将返回当前内存使用情况。并从IDE调试器Evalute/Modify调用它,添加到Watches或调用OutputDebugString,并查看当前内存使用情况
  • 注意,如果内存是由某个DLL创建的,那么使用(3)可能看不到她的内存使用情况。使用(2)

    通过分析内存使用情况和应用程序执行的任务,您可能会发现导致内存使用率提高的原因。

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

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

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


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

    你有没有想过导致IDE。。。太大了

    在我的情况下(2GB内存),我做下一个。。。 1.打开IDE 2.让它最小化近六个小时 3.查看物理内存的使用情况

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

    这称为IDE引起的内存泄漏。。。我不在IDE上键入任何字母,不编译任何东西,甚至不打开任何项目。。。只需打开IDE并最小化它。。。离开计算机6个小时左右不做任何事情,IDE将消耗6GB内存

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

    这到底什么时候能修好

    请注意,我已经应用了所有补丁,我也在没有应用每个补丁/修补程序的情况下进行了测试,等等

    我得到的最好的结果就是在工具上取消了一些选项,比如在坏代码下面加下划线的选项等等。。。那他妈的为什么这个选择会有任何影响。。。我没有在IDE上键入任何内容(在测试中)。。。如果我把它解封,内存泄漏就会大大减少

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

    似乎在短时间内不会有解决方案

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


    丑陋的解决方案,我知道。。。但它是有效的

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

    FastMM4991引入了一种新方法,
    LogMemoryManager状态文件

    添加了LogMemoryManager状态文件调用。此调用记录以下内容的摘要: 文件的内存管理器状态:总分配内存、开销、, 效率,以及按类和字符串类型划分的分配内存的细目。 此调用可能有助于捕获不一定泄漏但 不要逗留太久

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