Delhpi TIdHTTPServer постепенно увеличивает память

У меня есть серверная сборка с TIdHTTPServer на XE6 (с установкой 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 МБ.

У TIdHTTPServer утечка памяти?

Обновление:

в небольшом тестовом приложении с

initialization
  ReportMemoryLeaksOnShutdown := True;

нет утечки

Я также пытался использовать FastMM DLL, и это отчет (My SO на итальянском языке)

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

Утечка ди блок. Размеры: 20

Квесто-блок и статическое распределение потока 0x730, трассировка стека (indirizzo restituito) в эпоху Кель-Моменто [IdGlobalProtocols.IdGlobalProtocols] [4743] 6C9984 [IdGlobalProtocols.pas] [IdGlobalProtocols] [IdGlobalProtocols.IdGlobalProtocols] [4744] 6C99D5 [IdThread.pas] 40d [40] IFDFD] [40] IFDFD, EF, IdGread, FD, IdGread, FD, EF, IdGlobal,, 40, I, I, I, I,,. [SysInit.]

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

Количество номеров: 475

Dump della memoria di 256 byte 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 AF 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 AD 80 80 80 80 ü. день ` . ú ~ .,,,,,,,,, Z. € € € € .,,, ± Õ ó ~ .,,,,,,,,,,,,,,, â .,, Ш г @ . ¯ ‡ @ . Ö Ž @ . ¤ ˆ @ . … Ò . º … Ò ., ü L . û û L ., СК если. ] š l . € Ÿ @ . Ÿ Ÿ @ . · Ô @ . D ¡ l . z 3 Æ u ‚ ˜ ¯ w U ˜ ¯ w .,,,,,,,,,,, 0,, 0,, ¦ г @. @ ‡ @ .! @ . Æ ˆ @ . Ó ˆ @ . 8 л Ó ˆ @. б C K . Ó ˆ @ . > 'ф., Ÿ @., £ @ . ‡ ¡ l . z 3 Æ u ‚ ˜ ¯ w U ˜ ¯ w .,,,,,,,,,,,,,,,,,,,,,,, ¼ я N . E ¼ Ë R   A Ó . € € € € º C 4 € € € €

-------------------------------- 2015/11/2 14:52:38 -------- ----------------- Leak di un blocco. Размеры: 36

Квесто-блок и статическое распределение потока 0x730, трассировка стека (indirizzo restituito) в эпоху квантовых событий: 40678A 4087AF 408ED6 440106 [System.SyncObjs.pas][System][System.SyncObjs.TEvent.Create][827] 412EA Winapi.Windows.pas][Winapi][Winapi.Windows.GetProcAddress][34295] 6C98AB [IdStack.pas][IdStack][IdStack.IdStack][1138] 409F80 409FEC 40F4B7 [SysInitInit.p] @InitExe][1191] 6CA144 [WMain.pas][WMain][WMain.WMain][295] 75C6337A [BaseThreadInitThunk] 77AF9882 [Неизвестная функция в RtlInitializeExceptionChain] 77AF9855 [Неизвестная функция в RtlInitializeException

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

Количество номеров: 458

Dump della memoria di 256 byte partendo dall'indirizzo del puntatore 7EFA0A60: 90 D7 60 00 C0 9B 8A 00 FF 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 00 00 00 00 00 00 00 22 00 00 00 B0 04 02 00 70 93 97 CA × ` . КАК. ÿ ÿ ÿ ÿ .,,,,,,,,,,,,,,,,,,,, Ì § ° € € € € .,,, '. ú ~.,,,,,,,,,,,,,,, С.,, Ш г @ . £ ¤ @ . ¦ ¦ @ . С @., ´ ¯ w µ 3 ¯ w ã / ¯ w ú ú w + × Æ u H × Æ u º Ö Æ u ~ Ö Æ u 'Ö Æ u 2 ú w . Ö Æ у Æ Æ þ Æ Æ 4 4 G ± w ¡ G ± w . ò ® w t ® ® w 0 .,, 0,, ¦ г @ . ] ¥ @ . А ¡ @ . K ´ b ., Ÿ @., £ @ . ‡ ¡ l . z 3 Æ u ‚ ˜ ¯ w U ˜ ¯ w .,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, "...........

-------------------------------- 2015/11/2 14:52:38 -------- ----------------- Leak di un blocco. Размеры: 36

Блок данных и статический поток 0x730, трассировка стека (indirizzo restituito) в эпоху Куэль: 40678A 4087AF 408ED6 440106 [System.SyncObjs.pas] [System] [System.SyncObjs.TEvent.Create] [82740AF8] [IdThreadSafe][IdThreadSafe][IdThreadSafe..TIdThreadSafeObjectList][144] 6C99D5 [IdThread.pas][IdThread][IdThread.IdThread][732] 409F80 409FEC 40F4B7 [SitInSit]. 1191] 6CA144 [WMain.pas] [WMain] [WMain.WMain] [295] 75C6337A [BaseThreadInitThunk] 77AF9882 [Неизвестная функция в RtlInitializeExceptionChain] 77AF9855 [Неизвестная функция в RtlInitializeExceptionChain]

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

Количество номеров: 476

Dump della memoria di 256 byte partendo dall'indirizzo del puntatore 7EFA0F60: 90 D7 60 00 E8 9B 8A 00 FF 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 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 AF 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 È . € € € € .,,, '. ú ~.,,,,,,,,,,,,,,, ß .,, Ш г @ . £ ¤ @ . 0 © @ . & m K . ч к.,; ф. - л. € Ÿ @. Ÿ Ÿ @ . · Ô @ . D ¡ l . z 3 Æ u ‚ ˜ ¯ w U ˜ ¯ w .,,,,,,,,,,,,,,,,,,,,,,,,,,, 0,, 0,, ] ¥ @ . • º @ . ¹ ¹ @ . @ º @ . E È @ . é Ä @ . % Å @ . ú Æ @ . ›П к. ¶ г к. Ó ˆ @ . z @ f ., Ÿ @., £ @ . ‡ ¡ l . z 3 Æ u ‚ ˜ ¯ w U ˜ ¯ w .,,,,,,,,,,,,,,, °,,) "Ò P

1 ответ

Решение

Длительные процессы нередко имеют объем памяти после некоторого времени выполнения, который больше, чем объем памяти, возникающий вскоре после запуска. Даже когда процесс временно не обрабатывает запросы. Поскольку выделение памяти занимает некоторое время, некоторые менеджеры памяти (и я думаю, что FastMM также делает это) сохранят выделенную память, которая больше не используется, и готовы к тому моменту, когда программе потребуется назначить новые объекты или переменные, поэтому память можно повторно использовать.

В вашем случае, если это возможно, дайте процессу поработать еще несколько месяцев и убедитесь, что использование памяти стабильно и больше не растет. Если важно, чтобы эта память снова стала доступной для других процессов, проверьте, можете ли вы настроить FastMM с помощью параметров или параметров конфигурации.

Другие вопросы по тегам