一台旧应用程序在服务器更新后开始大量消耗内存。在程序挂起之前,内存使用似乎会超出限制。
根据FastMM4和EurekaLog,没有内存泄漏(28字节除外),因此我假设应用程序关闭时释放所有内存。
是否有适合跟踪此类内存问题的工具或策略?
答案 0 :(得分:8)
注意,如果某些DLL占用了内存,那么您可能无法使用(3)查看其内存使用情况。使用(2)。
分析内存使用情况和应用程序执行的任务,您可能会发现导致内存使用量增加的原因。
答案 1 :(得分:8)
自2012年9月以来,有一种非常简单而舒适的方法可以找到这种“仅限运行时”的内存泄漏。
FastMM4991引入了一种新方法LogMemoryManagerStateToFile
:
添加了LogMemoryManagerStateToFile调用。此调用记录了摘要 内存管理器状态到文件:总分配内存,开销, 效率,按类和字符串类型划分分配的内存。 此调用可能有助于捕获不一定泄漏的对象,但是 徘徊的时间比他们应该的长。
要在运行时发现泄漏,您只需要执行以下步骤
LogMemoryManagerStateToFile('memory.log', '')
的某个地方添加对{<1}}的调用答案 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分钟或更短时间重新打开它
丑陋的解决方案,我知道......但是有效!