1

我有一个在 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) in 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

d. ` . ú ~ . . . . . . . . . . z 。€ € € . . . . ±Õó~。. . . . . . . . . . . . . . . 一个 。. . Šg@。¯‡@。ÖŽ@。¤ ^ @ 。… Ò . º … Ò . . ü L. ž û L . . CK 如果 。] l 。€Ÿ@。ì Ÿ @ 。· ô@。D¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。. . . . . . . . . . . 0 . . . 0 . . . ¦ g@。我 ‡ @ 。!@ . Æ ^ @ 。Ó ^ @ 。8 y L . Ó ^ @ 。b CK。Ó ^ @ 。> ' f . . Ÿ @ . . 英镑@。‡ ¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。. . . . . . . . . . . . . . . . . . . . . . . ¼ 我 N 。E ¼ Ë R A Ó 。€ € € º C 4 € € € €</p> . . . . . . . . . . 一个 。. . Šg@。¯‡@。ÖŽ@。¤ ^ @ 。… Ò . º … Ò . . ü L. ž û L . . CK 如果 。] l 。€Ÿ@。ì Ÿ @ 。· ô@。D¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。. . . . . . . . . . . 0 . . . 0 . . . ¦ g@。我 ‡ @ 。!@ . Æ ^ @ 。Ó ^ @ 。8 y L . Ó ^ @ 。b CK。Ó ^ @ 。> ' f . . Ÿ @ . . 英镑@。‡ ¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。. . . . . . . . . . . . . . . . . . . . . . . ¼ 我 N 。E ¼ Ë R A Ó 。€ € € º C 4 € € € €</p> . . . . . . . . . . 一个 。. . Šg@。¯‡@。ÖŽ@。¤ ^ @ 。… Ò . º … Ò . . ü L. ž û L . . CK 如果 。] l 。€Ÿ@。ì Ÿ @ 。· ô@。D¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。. . . . . . . . . . . 0 . . . 0 . . . ¦ g@。我 ‡ @ 。!@ . Æ ^ @ 。Ó ^ @ 。8 y L . Ó ^ @ 。b CK。Ó ^ @ 。> ' f . . Ÿ @ . . 英镑@。‡ ¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。. . . . . . . . . . . . . . . . . . . . . . . ¼ 我 N 。E ¼ Ë R A Ó 。€ € € º C 4 € € € €</p> D¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。. . . . . . . . . . . 0 . . . 0 . . . ¦ g@。我 ‡ @ 。!@ . Æ ^ @ 。Ó ^ @ 。8 y L . Ó ^ @ 。b CK。Ó ^ @ 。> ' f . . Ÿ @ . . 英镑@。‡ ¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。. . . . . . . . . . . . . . . . . . . . . . . ¼ 我 N 。E ¼ Ë R A Ó 。€ € € º C 4 € € € €</p> D¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。. . . . . . . . . . . 0 . . . 0 . . . ¦ g@。我 ‡ @ 。!@ . Æ ^ @ 。Ó ^ @ 。8 y L . Ó ^ @ 。b CK。Ó ^ @ 。> ' f . . Ÿ @ . . 英镑@。‡ ¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。. . . . . . . . . . . . . . . . . . . . . . . ¼ 我 N 。E ¼ Ë R A Ó 。€ € € º C 4 € € € €</p>

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

Questo blocco è stato allocato dal thread 0x730, e lo stack trace (indirizzo restituito) in quel momento era: 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

作为 。ÿ ÿ ÿ ÿ 。. . . . . . . . . . . . . . . . . . . . ̧°€€€€。. . . ' . ú ~ . . . . . . . . . . . . . . . . Ñ . . . Šg@。英镑¤@。Ô ¦ @ 。Ñã@。. ´ ¯ w µ 3 ¯ w ã / ¯ w ú ú w + × Æ u H × Æ u º Ö Æ u ~ Ö Æ u ' Ö Æ u 2 ú w 。ÖÆ你。Ô Æ u þ Õ Æ u 4 G ± w ¡ G ± w 。ò ® 重量 ò ® w 0 。. . 0 . . . ¦ g@。] ¥ @ 。一个 @ 。ķ ' b 。. Ÿ @ . . 英镑@。‡ ¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . “……°……p”——Ê . ' . ú ~ . . . . . . . . . . . . . . . . Ñ . . . Šg@。英镑¤@。Ô ¦ @ 。Ñã@。. ´ ¯ w µ 3 ¯ w ã / ¯ w ú ú w + × Æ u H × Æ u º Ö Æ u ~ Ö Æ u ' Ö Æ u 2 ú w 。ÖÆ你。Ô Æ u þ Õ Æ u 4 G ± w ¡ G ± w 。ò ® 重量 ò ® w 0 。. . 0 . . . ¦ g@。] ¥ @ 。一个 @ 。ķ ' b 。. Ÿ @ . . 英镑@。‡ ¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . “……°……p”——Ê . ' . ú ~ . . . . . . . . . . . . . . . . Ñ . . . Šg@。英镑¤@。Ô ¦ @ 。Ñã@。. ´ ¯ w µ 3 ¯ w ã / ¯ w ú ú w + × Æ u H × Æ u º Ö Æ u ~ Ö Æ u ' Ö Æ u 2 ú w 。ÖÆ你。Ô Æ u þ Õ Æ u 4 G ± w ¡ G ± w 。ò ® 重量 ò ® w 0 。. . 0 . . . ¦ g@。] ¥ @ 。一个 @ 。ķ ' b 。. Ÿ @ . . 英镑@。‡ ¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . “……°……p”——Ê ´ ¯ w µ 3 ¯ w ã / ¯ w ú ú w + × Æ u H × Æ u º Ö Æ u ~ Ö Æ u ' Ö Æ u 2 ú w 。ÖÆ你。Ô Æ u þ Õ Æ u 4 G ± w ¡ G ± w 。ò ® 重量 ò ® w 0 。. . 0 . . . ¦ g@。] ¥ @ 。一个 @ 。ķ ' b 。. Ÿ @ . . 英镑@。‡ ¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . “……°……p”——Ê ´ ¯ w µ 3 ¯ w ã / ¯ w ú ú w + × Æ u H × Æ u º Ö Æ u ~ Ö Æ u ' Ö Æ u 2 ú w 。ÖÆ你。Ô Æ u þ Õ Æ u 4 G ± w ¡ G ± w 。ò ® 重量 ò ® w 0 。. . 0 . . . ¦ g@。] ¥ @ 。一个 @ 。ķ ' b 。. Ÿ @ . . 英镑@。‡ ¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . “……°……p”——Ê . “……°……p”——Ê . “……°……p”——Ê

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

Questo blocco è stato allocato dal thread 0x730, e lo stack trace (indirizzo restituito) in 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

è › Š。ÿ ÿ ÿ ÿ 。. . . . . . . . . . . . . . . . . . . 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 ' . ú ~ . . . . . . . . . . . . . . . . ß 。. . Š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 ' . ú ~ . . . . . . . . . . . . . . . . ß 。. . Š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 z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。. . . . . . . . . . . . . . . . . . . . . . . . . . . 0 . . . 0 . . . ] ¥ @ 。• º @ 。Ý ¹ @ 。Ý º @ 。EÈ@。é Ä @ . % 一个 @ 。Æ@。› n K . ¶克K。Ó ^ @ 。z@f。. Ÿ @ . . 英镑@。‡ ¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。. . . . . . . . . . . . . . . °。. . ) ” Ò P z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。. . . . . . . . . . . . . . . . . . . . . . . . . . . 0 . . . 0 . . . ] ¥ @ 。• º @ 。Ý ¹ @ 。Ý º @ 。EÈ@。é Ä @ . % 一个 @ 。Æ@。› n K . ¶克K。Ó ^ @ 。z@f。. Ÿ @ . . 英镑@。‡ ¡ z 3 Æ u ‚ ~ ¯ w U ~ ¯ w 。. . . . . . . . . . . . . . . °。. . ) ” Ò P

4

1 回答 1

1

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

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

于 2015-11-02T19:40:06.883 回答