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

blpfk2vs  于 2023-05-06  发布在  其他
关注(0)|答案(4)|浏览(197)

一个旧的应用程序在服务器更新后开始消耗大量内存。内存使用率似乎上升,直到程序挂起。
根据FastMM4和EurekaLog,没有内存泄漏(除了28个字节),所以我假设在应用程序关闭时释放了所有内存。
有没有什么工具或策略适合追踪这种记忆问题?

kxeu7u2r

kxeu7u2r1#

自2012年9月以来,有一种非常简单和舒适的方法可以找到这种类型的“仅运行时”内存泄漏。
FastMM4991引入了一种新方法LogMemoryManagerStateToFile
添加了LogMemoryManagerStateToFile调用。此调用将内存管理器状态的摘要记录到文件:分配的总内存、开销、效率以及按类和字符串类型分配的内存明细。此调用对于捕获不一定泄漏但延迟时间超过应有时间的对象可能很有用。
若要在运行时发现泄漏,只需执行以下步骤
1.在间隔调用LogMemoryManagerStateToFile('memory.log', '')的位置添加调用
1.运行应用程序
1.使用“tail”程序打开日志文件(例如,打开了tail模式的Notepad++),当文件内容更改时,该程序将自动刷新
1.注意文件的第一行,它们将包含占用最大内存量的内存分配
1.如果您看到一个类或内存类型的示例数量不断增加,这可能是泄漏的原因

gab6jxml

gab6jxml2#

1.不断增长的内存消耗是一个应用程序问题。这不是一个错误,可以发现FastMM 4或EurekaLog。从他们的Angular 来看-应用程序只是正确地使用内存。
1.使用AQTime,MemProof(很难找到,D 7是最后支持的版本)))、SleuthQA(类似于MemProof)或类似的内存分析器,您可以实时跟踪应用程序外部的内存使用情况。
1.使用FastMM 4、GetMemoryManagerState / GetMemoryManagerUsageSummary,您可以跟踪应用程序的内存使用情况。将这些信息输出到跟踪文件中,并在运行后对其进行分析。或者为上面的一个过程做一个简单的 Package 函数,它将返回当前的内存使用情况。并从IDE调试器Evalute / Modify调用它,添加到Watches或调用OutputDebugString,然后查看当前内存使用情况。
注意,如果内存被某个DLL占用,那么使用(3)可能看不到她的内存使用情况。使用(2)。
分析内存使用情况和应用程序执行的任务,您可能会发现导致内存使用增加的原因。

dfty9e19

dfty9e193#

AQTime(一个非常昂贵的商业工具)可以报告你的内存使用情况,直到分配每个对象的源代码行。在内存使用量非常大的情况下,您可能需要AQTime功能,该功能可以显示对象的数量和每个对象的大小(总大小加上单个示例大小)。AQTime对我来说工作得很好,从 Delphi 7开始,以及所有后来的版本,包括你的版本(2006)和最新版本(XE和XE 2)。
随着程序内存使用量的增长,AQTime可以用来抓取运行时堆的“快照”,你可以用它来了解你的应用程序的内存使用情况;正在创建的内容以及每个对象存在的数量。即使不存在泄漏,根据应用程序创建和管理的对象来理解应用程序的运行时行为也是非常重要的,AQTime是我所知道的 Delphi 用户最强大的工具。
如果你愿意升级到 Delphi /XE 2,你可能已经有一个包含的轻版本的AQTime了,如果是的话,看看它。如果没有,我建议你试试他们的演示。我不知道有任何免费或开源的替代品可以提供相同的功能。
可以通过编写大量跟踪消息或使用FastMM完全调试模式来手动拼凑较小的功能。如果您可以将内存使用情况的完整转储写入一个非常大的文件中,那么您就可以编写一些工具来解析并创建摘要。在这种情况下,我使用FastMM的问题是,您将淹没在详细信息中,而无法准确提取有助于您了解情况的摘要信息。因此,您可以尝试编写自己的工具来总结内存使用情况。在我的一个应用程序中,我使用了一系列我知道会使用大量内存的组件,我在应用程序中编写了一个对话框,显示这些大型内存blob数据对象的当前内存使用情况。

piok6c0g

piok6c0g4#

你有没有想过导致IDE的泄漏……它是如此巨大!!!
在我的情况下(2GB的RAM)我做下一个...1.打开IDE 2.让它最小化近6小时3.了解物理内存的使用情况
结果:当IDE被打开时(记得我也做了测试,让它最小化),它变得越来越多的RAM...直到再也没有空闲的公羊它获得所有2GB RAM +所有Pagefile硬盘空间(我将其配置为4GB的MAS)在不到六个小时(在IDE上什么都不做)内,它试图使用超过6 GB。
这被称为IDE导致的内存泄漏...我不在IDE上键入任何字母,不编译任何东西,甚至不打开任何项目...打开IDE并最小化它。离开计算机大约六个小时不做任何事情,IDE消耗了6 GB的内存。
当然,在那之后,IDE开始与恼人的消息SystemOutOfMemory...我必须杀了它那么所有的6 GB都被释放了!!!
到底什么时候才能修好
请注意,我已经应用了所有补丁,我也测试了没有应用每个补丁/修补程序等...
我得到的最好的是禁用工具上的一些选项,比如在坏代码下面加下划线的选项,等等。所以为什么这个选择会有影响...我没有在IDE上输入任何东西(在测试中)...如果我有它dissabled内存泄漏得到减少了很多...
当然,如果我使用IDE(在打开的项目上编写代码),甚至没有编译/运行它…事情会变得更糟内存泄漏高达6 GB可以在不到一个小时的时间内达到,有时会在复制/粘贴源代码15分钟后发生。
看来短时间内是没有办法了!!!
所以我得到了下一个完美的解决方案:- 关闭IDE并每隔15分钟或更短时间重新打开一次
丑陋的解决办法,我知道。。但工作!!!

相关问题