delphi XE6 TIdHTTP.Get(Indy 10)内存消耗

delphi XE6 TIdHTTP.Get(Indy 10)内存消耗,delphi,memory-leaks,indy10,idhttp,Delphi,Memory Leaks,Indy10,Idhttp,我有这个功能 function doHTTPRequest(const AUrl: String): String; // ------------------------------------------------------------------------ // return the response for a http request var aIdHTTP : TIdHTTP; begin Result := ''; aIdHTTP := TIdHTTP.

我有这个功能

function doHTTPRequest(const AUrl: String): String;
// ------------------------------------------------------------------------
// return the response for a http request
var
   aIdHTTP : TIdHTTP;
begin
   Result  := '';

   aIdHTTP := TIdHTTP.Create(nil);
   try
     aIdHTTP.HandleRedirects := true;
     aIdHTTP.RedirectMaximum := 5;
     aIdHTTP.ConnectTimeout  := 5000;
     aIdHTTP.ReadTimeout     := 10000;

     Result := aIdHTTP.Get(aUrl);

     aIdHTTP.Disconnect(false); 

     if Assigned(aIdHTTP.IOHandler) then
        aIdHTTP.IOHandler.InputBuffer.Clear;

   finally
      if Assigned(aIdHTTP) then FreeAndNil(aIdHTTP);
   end;
end;
每次我调用这个函数,“任务管理器”中的进程都会增加200字节(或多或少)的私有工作集内存

我错在哪里

我已经使用FastMM和AQTime,但没有发现内存泄漏

这是我在任务管理器中看到的一个例子,从
开始
结束
内存增加了200字节,而且从未释放过

doHTTPRequest 
    begin = 3.480 KB
    end   = 3.652 KB
    ----------------
    diff.     184 Byte
doHTTPRequest
返回值为html字符串(约20KB)

TIdHttpServer
调用
doHTTPRequest
,如下所示:

procedure TServer.CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
   AResponseInfo.ContentText := doHTTPRequest('http://example.com/foo.html');
end

首先,如果要立即释放
TIdHTTP
对象,则无需调用
Disconnect()
InputBuffer.Clear()
。如果套接字仍处于连接状态,析构函数将为您关闭并释放套接字


其次,
TIdHTTP.Get()
在下载内容时确实在内部分配内存,但它也释放了分配的所有内存。在您的示例中,
Get()。您必须记住,Delphi的内存管理器(默认情况下)不会将释放的内存返回操作系统,内存会被缓存以供以后重用。这就是任务管理器向您展示的内容。任务管理器只知道进程从操作系统分配的内存,但不知道进程实际如何使用该内存。不能使用任务管理器诊断内存泄漏。您必须使用FastMM自己的泄漏跟踪功能,因为只有它知道哪些内存实际泄漏或没有泄漏。您可以在
系统
单元中启用全局变量,但默认安装的FastMM启用了最小泄漏报告。要获得更详细的报告,请在项目中安装完整版本的FastMM,并根据需要进行配置。

首先,如果要立即释放
TIdHTTP
对象,则无需调用
Disconnect()
InputBuffer.Clear()
。如果套接字仍处于连接状态,析构函数将为您关闭并释放套接字


其次,
TIdHTTP.Get()
在下载内容时确实在内部分配内存,但它也释放了分配的所有内存。在您的示例中,
Get()。您必须记住,Delphi的内存管理器(默认情况下)不会将释放的内存返回操作系统,内存会被缓存以供以后重用。这就是任务管理器向您展示的内容。任务管理器只知道进程从操作系统分配的内存,但不知道进程实际如何使用该内存。不能使用任务管理器诊断内存泄漏。您必须使用FastMM自己的泄漏跟踪功能,因为只有它知道哪些内存实际泄漏或没有泄漏。您可以在
系统
单元中启用全局变量,但默认安装的FastMM启用了最小泄漏报告。要获得更详细的报告,请在您的项目中安装完整版本的FastMM,并根据需要进行配置。

ReportMemoryLeaksOnShutdown仅报告TIdThreadSafeInteger和TIdCriticalSection中的小泄漏,但我发现这对于Indy stack来说是正常的。我认为FastMM永远不会释放内存,这会逐渐增加24/24小时服务器服务。有没有建议强制FastMM以编程方式(每周)释放内存?ReportMemoryLeaksOnShutdown只报告TIdThreadSafeInteger和TIdCriticalSection中的小泄漏,但我知道这对于Indy stack是正常的。我认为FastMM永远不会释放内存,这会逐渐增加24/24小时服务器服务。有没有建议强制FastMM以编程方式(每周)释放内存?