我正在使用内置FastMM4内存管理器的Delphi 2009。
我的程序读取并处理大型数据集。每当我清除数据集或退出程序时,所有内存都能正确释放,没有任何内存泄漏。
使用spenwarr在如何获取Delphi程序使用的内存中提供的CurrentMemoryUsage例程,我已经显示了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和其他结构需要清除。我仍然不确定我的程序如何在早期周期中仍然有额外数据的情况下正确工作,但它确实成功了。我可能会进一步研究这个问题。
这个问题已经得到解答。感谢你的帮助。