【问题标题】:delphi XE6 TIdHTTP.Get (Indy 10) memory consuptiondelphi XE6 TIdHTTP.Get (Indy 10) 内存消耗
【发布时间】:2016-03-15 20:47:30
【问题描述】:

我有这个功能

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 Byte(或多或少)的私有工作集内存。

我哪里错了?

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

这是我在任务管理器中看到的一个示例,从beginend 内存增加了 200 字节并且它永远不会被释放...

doHTTPRequest 
    begin = 3.480 KB
    end   = 3.652 KB
    ----------------
    diff.     184 Byte

doHTTPRequest返回值为html字符串(约20KB)

doHTTPRequestTIdHttpServer 调用,如下所示:

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

【问题讨论】:

    标签: delphi memory-leaks indy10 idhttp


    【解决方案1】:

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

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

    【讨论】:

    • ReportMemoryLeaksOnShutdown 仅报告 TIdThreadSafeInteger 和 TIdCriticalSection 中的小泄漏,但我有 read 这对于 Indy 堆栈来说是正常的。我认为 FastMM 从不释放内存,这在 24/24 小时服务器服务中逐渐增加。有什么建议可以强制 FastMM 以编程方式(每周)释放内存?
    猜你喜欢
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 2014-12-23
    • 1970-01-01
    • 2015-09-14
    • 2014-08-23
    • 1970-01-01
    相关资源
    最近更新 更多