相关疑难解决方法(0)

我的程序永远不会释放内存.为什么?

我有一个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?(说服内存管理器释放内存)

delphi

3
推荐指数
1
解决办法
3751
查看次数

何时调用SetProcessWorkingSetSize?(说服内存管理器释放内存)

在之前的帖子中(我的程序永远不会释放内存.为什么?)我表明FastMM可以缓存(读取为自身保持)相当大的内存.如果您的应用程序刚刚在RAM中加载了大量数据集,则在释放数据后,您将看到令人印象深刻的RAM未释放回内存池.

我环顾四周,似乎调用SetProcessWorkingSetSize API函数会将缓存"刷新"到磁盘.但是,我无法决定何时调用此函数.我想在执行RAM密集型操作的按钮上的OnClick事件结束时调用它.但是,有些人说这可能会导致AV.

如果有人成功使用此功能,请告诉我(我们).

非常感谢.


编辑:
1.释放数据集后,程序仍然需要大量的RAM.调用SetProcessWorkingSetSize后,大小返回到几MB.有人争辩说什么都没有被释放.我同意.但是内存占用现在很小,并且在正常使用程序后不会增加(例如,在执行不涉及加载大型数据集的正常操作时).不幸的是,没有办法证明交换到磁盘的内存被装回内存,但我认为不是.2.我已经证明了(我希望)这不是内存泄漏:
我的程序永远不会释放内存.为什么?
如何说服内存管理器释放未使用的内存

delphi

2
推荐指数
2
解决办法
3176
查看次数

标签 统计

delphi ×2