我使用的是 Delphi 2009,它内置了 FastMM4 内存管理器。
我的程序读入并处理一个大型数据集。每当我清除数据集或退出程序时,所有内存都会正确释放。它根本没有内存泄漏。
使用 spenwarr 的回答中给出的 CurrentMemoryUsage 例程:如何获取 Delphi 程序使用的内存,我已经显示了 FastMM4 在处理过程中使用的内存。
似乎正在发生的事情是,在每个进程和释放周期之后,内存使用量都在增长。例如:
在没有数据集的情况下启动我的程序后使用了 1,456 KB。
加载大型数据集后使用了 218,455 KB。
完全清除数据集后的 71,994 KB。如果我此时退出(或我的示例中的任何一点),则不会报告内存泄漏。
再次加载相同的数据集后使用了 271,905 KB。
完全清除数据集后 125,443 KB。
再次加载相同的数据集后使用了 325,519 KB。
完全清除数据集后 179,059 KB。
再次加载相同的数据集后使用了 378,752 KB。
似乎我的程序的内存使用在每个加载/清除周期增加了大约 53,400 KB。任务管理器确认这确实发生了。
我听说 FastMM4 并不总是在释放对象时将所有程序内存释放回操作系统,以便在需要更多内存时保留一些内存。但是这种持续的增长让我很困扰。由于没有报告内存泄漏,我无法确定问题。
有谁知道为什么会发生这种情况,如果它是坏的,如果有什么我可以或应该做的吗?
感谢 dthorpe 和 Mason 的回答。你让我思考和尝试让我意识到我错过了什么的事情。所以需要详细的调试。
事实证明,我所有的结构在退出时都得到了适当的释放。但是在运行期间每个循环后的内存释放不是。它正在累积内存块,如果我的退出清理不正确,通常会导致在退出时可以检测到的泄漏 - 但确实如此。
我需要在周期之间清除一些 StringLists 和其他结构。我仍然不确定我的程序如何正确处理早期周期中仍然存在的额外数据,但确实如此。我可能会进一步研究。
这个问题已经回答了。谢谢你的帮助。