我有一段Delphi代码,在一些Windows服务中运行:
if FindFirst(path,faArchive,searchrecord) then
try
DoSomething(searchrecord);
while FindNext(searchrecord) do
DoSomething(searchrecord);
finally
FindClose(searchRecord);
end;
这实际上是每个n'在一个线程内的秒(搜索目录内容,然后为在...内找到的每个文件发送邮件)然后新内容将被另一个进程放入该文件夹..然后再次..)。
一切都很好(邮件被发送,文件被移动到另一个文件夹等), 但是我们的客户抱怨内存消耗量很大......快速增长。
所以我们检查一下,首先确认内存泄漏, 然后确定无疑 那段代码.. FindeFirst - > FindNext - > FindClose ..,是'罪犯'
然后搜索和搜索(首先,这个......然后是网络),我们找到了神秘的'
SetProcessWorkingSetSize(GetCurrentProcess(), DWORD(-1), DWORD(-1))
观看here,here ..以及许多其他stackoverflow条目,讨论使用此Windows功能的好处或不便。
最后一个事实是,当执行该代码块时,内存usarge似乎在增加和增加(FindFirst .. FindClose)..在Windows任务管理器中观察此消耗 < /强>
所以..亲爱的伙伴......
SetProcessWorkingSetSize(GetCurrentProcess(), DWORD(-1), DWORD(-1))
适用于这种情况?..那么如何使用它?答案 0 :(得分:3)
您的问题中的代码无法编译。但是,看起来你只是错误地将它转录到了问题中。
此文件枚举循环本身不会泄漏。它没有问题。如果问题中的代码确实泄漏,那么唯一合理的结论就是DoSomething
导致泄密。
调试此方法的常用方法是使用FastMM的完整版本。要求它在关机时报告内存泄漏。运行程序,关闭它并研究诊断。这应该会导致一些泄漏。修复它们直到没有剩下。
至于SetProcessWorkingSetSize(..., -1, -1)
,将内存从RAM中推出到磁盘上。你当然可以这样做,但它可能导致磁盘颠簸。您将内存推送到磁盘上。然后你需要它并且必须再次将它读入RAM。让系统管理你的记忆。