【发布时间】: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 月以来,有一种非常简单和舒适的方法可以找到这种类型的“仅运行时”内存泄漏。