可以清理记忆吗?

时间:2010-01-08 23:44:42

标签: delphi garbage-collection memory-management

我在Win32项目中使用Delphi 5(安装了FastMM),并且最近一直在尝试大幅减少此应用程序中的内存使用量。到目前为止,我已将使用量减少了近一半,但在处理单独的任务时发现了一些问题。当我最小化应用程序时,内存使用量从45兆减少到1兆,这归功于它分页到磁盘。当我恢复并重新开始工作时,内存仅增加到15兆。当我继续工作时,内存使用率再次缓慢上升,最小化和恢复将其恢复到15兆。所以我的想法是,当我的代码告诉系统释放内存时,根据Windows仍然保留它,实际的垃圾收集直到很久以后才开始。

任何人都可以确认/否认这种行为吗?是否有可能以编程方式清理内存?如果我继续使用该程序而不执行此手动刷新,我会在一段时间后出现内存不足错误,并希望消除它。感谢。

编辑:我在about.com上发现了一篇文章,其中提供了很多内容以及其他内存管理领域的链接和数据。

7 个答案:

答案 0 :(得分:73)

答案 1 :(得分:17)

这是我们在DSiWin32中使用的内容:

procedure DSiTrimWorkingSet;
var
  hProcess: THandle;
begin
  hProcess := OpenProcess(PROCESS_SET_QUOTA, false, GetCurrentProcessId);
  try
    SetProcessWorkingSetSize(hProcess, $FFFFFFFF, $FFFFFFFF);
  finally CloseHandle(hProcess); end;
end; { DSiTrimWorkingSet }

答案 2 :(得分:5)

让我们直截了当: FastMM4不会泄漏内存,您的代码可能会泄漏。

要确定,请在应用程序的某处执行此指令(其中FastMM4在uses子句中并且$define ManualLeakReportingControl已设置,例如在FastMM4Options.inc中):

ReportMemoryLeaksOnShutdown := True;

如果忘记释放一些记忆,FastMM4最后会报告。

如果您想了解更多信息,可以在CodeRage 2中观看此视频:Fighting Memory Leaks for Dummies

答案 3 :(得分:3)

在从Barry Kelly的优秀答案中学习之后,尝试使用来自Sysinternals的VMMap分析您的过程,可以找到here。这甚至比Process Explorer更详细地分析了单个进程的内存使用情况:“VMMap是希望理解和优化其应用程序内存资源使用情况的开发人员的理想工具。”它也有一个有用的帮助文件。

答案 4 :(得分:2)

任务管理器不显示您的程序实际使用的内容。它显示了内存管理器从Windows分配的总数。释放对象或以其他方式释放动态分配的内存时,它会立即返回到内存管理器(FastMM)。是否将其传回Windows是另一回事。内存管理器喜欢保留一些额外的内存,因此每次需要创建新对象时都不需要从操作系统中获取更多内存。 (这是一件好事,你不想改变它。)

如果你的程序的内存使用量不断增加,而不是在某个时刻达到稳定状态,你可能想环顾四周,看看你是否在某处泄漏了内存。正如Mark所说,Delphi不使用自动垃圾收集。如果您不了解这一点,请确保您要么释放您的物品,要么将其所有权交给可以在不再需要时释放它们的物品。

答案 5 :(得分:0)

我以前读过这个,但没有直接的经验。调用WINAPI SetProcessWorkingSetSize()应该“修复”问题。我再次没有这方面的直接经验。

答案 6 :(得分:-1)

我最近遇到了与我的程序非常相似的问题。请参阅我的问题:Why does my Delphi program’s memory continue to grow?

尽管我确信这是别的东西,但事实证明是由于我的代码中的一些错误导致内存泄漏而造成的主要内存泄漏。

在你做任何其他事情之前,请确保你正确释放所有记忆。