【问题标题】:Delphi TIdHTTPServer gradually increase memoryDelphi TIdHTTPServer 逐渐增加内存
【发布时间】:2015-11-02 11:24:46
【问题描述】:

我有一个在 XE6 上使用 TIdHTTPServer 构建的服务器(默认安装 Indy 10 并在组件上设置默认选项)用于文件下载:

procedure CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
    AResponseInfo.ContentStream := TFileStream.Create('C:\MyFile.Exe', fmOpenRead or fmShareDenyNone);
end;

经过数月(6 个月)和大量请求(更少或更多 1'000'000)后,服务器进程将私有内存(在任务管理器上)增加超过 50 MB。

TIdHTTPServer 是否泄漏内存?

更新

在一个小型测试应用程序中使用

initialization
  ReportMemoryLeaksOnShutdown := True;

没有泄漏

我也尝试过使用 FastMM dll,这是报告(我的 SO 是意大利语)

--------------------------------2015/11/2 14:52:38----- --------------------

泄漏di un blocco。尺寸 è: 20

Questo blocco è stato allocato dal thread 0x730, e lo stack trace (indirizzo restituito) 在 quel momento 时代:40678A 4087AF 408ED6 640996 [IdThreadSafe][IdThreadSafe][IdThreadSafe..TIdThreadSafeObjectList][144] 6C996F [IdGlobalProtocols.pas][IdGlobalProtocols][IdGlobalProtocols.IdGlobalProtocols][4743] 6C9984 [IdGlobalProtocols.pas][IdGlobalProtocols][IdGlobalProtocols.IdGlobalProtocols][4744] 6C99D5 [IdThread.pas][IdThread][IdThread.IdThread][732] 409F80 409FEC 40F4B7 [SysInit.pas][SysInit][SysInit.@InitExe][1191] 6CA144 [WMain.pas][WMain][WMain.WMain][295] 75C6337A [BaseThreadInitThunk] 77AF9882 [RtlInitializeExceptionChain 处的未知函数] 77AF9855 [RtlInitializeExceptionChain 的未知函数]

Il blocco è attualmente usato da una istanza della classe: TIdThreadSafeInteger

Il numero di allocazione è: 475

Dump della memoria di 256 字节 partendo dall'indirizzo del puntatore 7EF3D2C0:FC 02 64 00 60 0F FA 7E 00 00 00 00 00 00 00 00 0B 12 7A 17 80 80 80 80 00 00 00 00 B1 D5 F3 7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E2 01 00 00 8A 67 40 00 AF 87 40 00 D6 8E 40 00 A4 88 40 00 8D 85 D2 00 BA 85 D2 00 15 FC 4C 00 9E FB 4C 00 05 43 4B 00 ED 91 66 00 5D 9A 6C 00 80 9F 40 00 EC 9F 40 00 B7 F4 40 00 44 A1 6C 00 7A 33 C6 75 82 98 AF 77 55 98 AF 77 00 00 00 00 00 00 00 00 00 00 00 00 30 07 00 00 30 07 00 00 A6 67 40 00 CD 87 40 00 21 8F 40 00 C6 88 40 00 D3 88 40 00 38 FD 4C 00 D3 88 40 00 62 43 4B 00 D3 88 40 00 3E 92 66 00 14 9F 40 00 14 A3 40 00 87 A1 6C 00 7A 33 C6 75 82 98 AF 77 55 98 自动对焦 77 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 BC 69 4E 00 45 BC CB 52 A0 41 D3 00 80 80 80 80 BA 43 公元 34 年 80 80 80 80 ü 。 d. ` . ú ~ . . . . . . . . . . z 。 € € € . . . . ±Õó~。 . . . . . . . . . . . . . . .一种 。 . . Šg@。 ¯‡@。 ÖŽ@。 ¤ ^ @ . … Ò . º … Ò . . ü L. ž û L . . CK。一世 ' F 。 ] l 。 €Ÿ@。 ì Ÿ @ 。 · ô@。 D¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。 . . . . . . . . . . . 0 . . . 0 . . . ¦ g@。一世 ‡ @ 。 ! @ . Æ ^ @ 。 Ó ^ @ . 8 y L . Ó ^ @ 。 b CK。 Ó ^ @ 。 > ' f . . Ÿ @ . .英镑@。 ‡ ¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。 . . . . . . . . . . . . . . . . . . . . . . . ¼我 ñ。 E ¼ Ë R A Ó 。 € € € º C 4 € € € €

--------------------------------2015/11/2 14:52:38----- -------------------- 泄漏di un blocco。尺寸 è: 36

Questo blocco è stato allocato dal thread 0x730, e lo stack trace (indirizzo restituito) 在 quel momento 时代:40678A 4087AF 408ED6 440106 [System.SyncObjs.pas][System][System.SyncObjs.TEvent.Create][827] 412FEA [Winapi.Windows.pas][Winapi][Winapi.Windows.GetProcAddress][34295] 6C98AB [IdStack.pas][IdStack][IdStack.IdStack][1138] 409F80 409FEC 40F4B7 [SysInit.pas][SysInit][SysInit.@InitExe][1191] 6CA144 [WMain.pas][WMain][WMain.WMain][295] 75C6337A [BaseThreadInitThunk] 77AF9882 [RtlInitializeExceptionChain 处的未知函数] 77AF9855 [RtlInitializeExceptionChain 的未知函数]

Il blocco è attualmente usato da una istanza della classe: TIdCriticalSection

Il numero di allocazione è: 458

Dump della memoria di 256 字节 partendo dall'indirizzo del puntatore 7EFA0A60:90 D7 60 00 C0 9B 8A 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 16 CC A7 B0 80 80 80 80 00 00 00 00 91 0B FA 7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D1 01 00 00 8A 67 40 00 A3 A4 40 00 D4 A6 40 00 D1 E3 40 00 0E B4 AF 77 B5 33 AF 77 E3 2F AF 77 FA FA AD 77 2B D7 C6 75 48 D7 C6 75 BA D6 C6 75 7E D6 C6 75 91 D6 C6 75 32 FA AD 77 1A D6 C6 75 04 D4 C6 75 FE D5 C6 75 34 47 B1 77 A1 47 B1 77 09 F2 AE 77 74 F2 AE 77 30 07 00 00 30 07 00 00 A6 67 40 00 5D A5 40 00 41 A1 40 00 4B B4 62 00 14 9F 40 00 14 A3 40 00 87 A1 6C 00 7A 33 C6 75 82 98 AF 77 55 98 AF 77 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 00 00 00 B0 04 02 00 70 93 97 CA × `。作为 。 ÿ ÿ ÿ ÿ 。 . . . . . . . . . . . . . . . . . . . . ̧°€€€€。 . . . ' . ú ~ . . . . . . . . . . . . . . . . Ñ . . . Šg@。英镑¤@。 Ô ¦ @ 。 Ñã@。 . ´ ¯ w µ 3 ¯ w ã / ¯ w ú ú w + × Æ u H × Æ u º Ö Æ u ~ Ö Æ u ‘ Ö Æ u 2 ú w . ÖÆ你。 Ô Æ u þ Õ Æ u 4 G ± w × G ± w 。 ò ® w t ò ® w 0 。 . . 0 . . . ¦ g @ . ] ¥ @ 。一种 @ 。 ķ ' b 。 . Ÿ @ . .英镑@。 ‡ ¡ 升。 z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . “……°……p”——Ê

--------------------------------2015/11/2 14:52:38----- -------------------- 泄漏di un blocco。尺寸 è: 36

Questo blocco è stato allocato dal thread 0x730, e lo stack trace (indirizzo restituito) 在 quel momento 时代:40678A 4087AF 408ED6 440106 [System.SyncObjs.pas][System][System.SyncObjs.TEvent.Create][827] 4087B8 6409AF [IdThreadSafe][IdThreadSafe][IdThreadSafe..TIdThreadSafeObjectList][144] 6C99D5 [IdThread.pas][IdThread][IdThread.IdThread][732] 409F80 409FEC 40F4B7 [SysInit.pas][SysInit][SysInit.@InitExe][1191] 6CA144 [WMain.pas][WMain][WMain.WMain][295] 75C6337A [BaseThreadInitThunk] 77AF9882 [RtlInitializeExceptionChain 处的未知函数] 77AF9855 [RtlInitializeExceptionChain 的未知函数]

Il blocco è attualmente usato da una istanza della classe: TIdCriticalSection

Il numero di allocazione è: 476

Dump della memoria di 256 字节 partendo dall'indirizzo del puntatore 7EFA0F60:90 D7 60 00 E8 9B 8A 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 76 7F C8 17 80 80 80 80 00 00 00 00 91 10 FA 7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 DF 01 00 00 8A 67 40 00 A3 A4 40 00 30 A9 40 00 26 6D 4B 00 81 68 4B 00 12 3B 66 00 2D 9A 6C 00 80 9F 40 00 EC 9F 40 00 B7 F4 40 00 44 A1 6C 00 7A 33 C6 75 82 98 AF 77 55 98 AF 77 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30 07 00 00 30 07 00 00 5D A5 40 00 95 BA 40 00 DD B9 40 00 DD BA 40 00 45 C8 40 00 E9 C4 40 00 25 C5 40 00 FA C6 40 00 9B 6E 4B 00 B6 67 4B 00 D3 88 40 00 7A 40 66 00 14 9F 40 00 14 A3 40 00 87 A1 6C 00 7A 33 C6 75 82 98 AF 77 55 98 自动对焦 77 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 B0 04 02 00 29 94 D2 50 × `。 è › Š。 ÿ ÿ ÿ ÿ 。 . . . . . . . . . . . . . . . . . . . v È 。 € € € . . . . ' . ú ~ . . . . . . . . . . . . . . . . ß 。 . . Šg@。英镑¤@。 0 © @ 。 &米K。 ķ。 . ; F 。 - l 。 €Ÿ@。 ì Ÿ @ 。 · ô@。 D¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。 . . . . . . . . . . . . . . . . . . . . . . . . . . . 0 . . . 0 . . . ] ¥ @ . • º @ 。 Ý ¹ @ 。 Ý º @ 。 EÈ@。 é Ä @ . % 一种 @ . Æ@。 › n K . ¶克K。 Ó ^ @ 。 z@f。 . Ÿ @ . .英镑@。 ‡ ¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。 . . . . . . . . . . . . . . . °。 . . )”ÒP

【问题讨论】:

  • 为什么要在这里问?你可以自己找出来。制作一个小测试应用程序并将ReportMemoryLeaksOnShutdown 设置为true...
  • @whosrdaddy 我已经更新了问题
  • 你是使用 XE6 内置的 Indy 服务器,还是使用来自 svn trunk 的最新可用代码?
  • @whosrdaddy 是的! XE6 内置 Indy 服务器(Indy 10)
  • 相关答案在这里:Strategy or tools to find “non-leak” memory usage problems in Delphi? - 自 2012 年 9 月以来,有一种非常简单和舒适的方法可以找到这种类型的“仅运行时”内存泄漏。

标签: delphi indy indy10 idhttp


【解决方案1】:

长时间运行的进程在某些运行时间后的内存占用量大于启动后不久的内存占用量,这并不异常。即使进程暂时不处理请求。由于内存分配需要一些时间,一些内存管理器(我认为 FastMM 也这样做)将保持不再使用的内存仍然分配,为软件需要分配新对象或变量时做好准备,因此内存可以重复使用。

在您的情况下,如果可能,让进程再运行几个月,看看内存使用情况是否稳定,不再持续增长。如果重要的是该内存应该再次可供其他进程使用,请检查您是否可以使用选项或配置设置调整 FastMM。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 2015-04-07
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 2014-09-05
    相关资源
    最近更新 更多