我正在使用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和其他结构.我仍然不确定我的程序如何正常工作,还有早期周期中的额外数据,但确实如此.我可能会进一步研究.
这个问题已得到解答.谢谢你的帮助.
我多年来一直在涉及delphi,我一直想知道为什么最小化和恢复应用程序会导致它使用更少的内存?
作为一个例子,我正在使用delphi 7并且我创建了一个没有任何内容的新项目,但所有项目的空白表单开始,然后我按F9运行应用程序,然后查看应用程序的内存使用情况,它位于大约3.5mb我然后最小化应用程序和内存使用量下降到大约760kb然后我终于恢复应用程序和内存使用量回升到大约1.5mb,这大约是它第一次加载时的1/2这总是让我感到困惑的是,是什么让这种情况发生,甚至更重要的是,无论如何,使用一些指令启动应用程序,使其使用1.5mb的内存而不是通常使用的3.5mb.
干杯,戴夫
我有一个MDI计划.当它启动时需要2-3MB的RAM.然后,在这个程序中,我创建了大约260个MDI子窗口(每个窗口都有一个TStringGrid,一个位图和一些其他控件)并显示一些数据.该应用程序需要大约500MB来加载所有这些窗口.如果我手动关闭每个MDI子项,应用程序仍然使用160MB的RAM.为什么它不会返回几MB的RAM?我应该担心吗?对于只有1GB或RAM的系统来说,这是160MB!
注意:我使用任务管理器中的WORKING SET列来查看RAM统计信息.也许我需要一个更好的工具来读取RAM利用率.(私人工作集只比工作集小一点).
这不是泄漏!
FastMM(设置为激进)表示关闭程序时没有内存泄漏.有关其不是泄漏的其他证据,请参阅我的答案帖子.
我释放的东西
许多人告诉我,关闭一个儿童窗口只能隐藏它.我知道.我使用"Action:= caFree"来实际发布表单.每个表单都负责释放它所拥有的控件.
回答
我发现FastMM对此负有责任.请参阅我在下面发布的答案.
Delphi 7,Win 7 32位
类似帖子:
可以清理内存吗?
何时调用SetProcessWorkingSetSize?(说服内存管理器释放内存)
在之前的帖子中(我的程序永远不会释放内存.为什么?)我表明FastMM可以缓存(读取为自身保持)相当大的内存.如果您的应用程序刚刚在RAM中加载了大量数据集,则在释放数据后,您将看到令人印象深刻的RAM未释放回内存池.
我环顾四周,似乎调用SetProcessWorkingSetSize API函数会将缓存"刷新"到磁盘.但是,我无法决定何时调用此函数.我想在执行RAM密集型操作的按钮上的OnClick事件结束时调用它.但是,有些人说这可能会导致AV.
如果有人成功使用此功能,请告诉我(我们).
非常感谢.
编辑:
1.释放数据集后,程序仍然需要大量的RAM.调用SetProcessWorkingSetSize后,大小返回到几MB.有人争辩说什么都没有被释放.我同意.但是内存占用现在很小,并且在正常使用程序后不会增加(例如,在执行不涉及加载大型数据集的正常操作时).不幸的是,没有办法证明交换到磁盘的内存被装回内存,但我认为不是.2.我已经证明了(我希望)这不是内存泄漏:
我的程序永远不会释放内存.为什么?
如何说服内存管理器释放未使用的内存