我知道如何使用GlobalMemoryStatusEx获取系统内存,但这告诉我整个操作系统正在使用的内容.
我真的希望我的程序能够报告它单独分配和使用的内存量.
我的Delphi 2009程序中是否有任何方法可以调用Windows函数或某些FastMM函数来查找我的程序单独分配的内存?
重新审视我的问题,我现在已经通过@apenwarr更改了我对GetMemoryManagerState答案的接受答案.它产生了与我以前使用的GetHeapStatus函数(现已弃用)相同的结果,而GetProcessMemoryInfo.WorkingSetSize给出了非常不同的结果.
我在Win32项目中使用Delphi 5(安装了FastMM),并且最近一直在尝试大幅减少此应用程序中的内存使用量.到目前为止,我已将使用量减少了近一半,但在处理单独的任务时发现了一些问题.当我最小化应用程序时,内存使用量从45兆位缩减到1兆位,这归功于它分页到磁盘.当我恢复并重新开始工作时,内存仅增加到15兆.当我继续工作时,内存使用量再次缓慢上升,最小化和恢复将其恢复到15兆.所以我的想法是,当我的代码告诉系统释放内存时,根据Windows仍然保留它,实际的垃圾收集直到很久以后才开始.
任何人都可以确认/否认这种行为吗?是否有可能以编程方式清理内存?如果我继续使用该程序而不执行此手动刷新,我会在一段时间后出现内存不足错误,并希望消除它.谢谢.
编辑:我在about.com上发现了一篇文章,其中提供了很多内容以及其他内存管理领域的链接和数据.
我有一个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?(说服内存管理器释放内存)