Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Устранение утечек памяти в серверных приложениях Delphi с использованием 64-битного RTL

Delphi , Синтаксис , Память и Указатели

Утечки памяти в серверных приложениях на Delphi могут быть вызваны различными причинами, в том числе и ошибками в RTL (Runtime Library) при работе в 64-битной версии. В данной статье мы рассмотрим проблему утечек памяти, обнаруженную в Win64 версии Delphi RTL во время завершения работы потока, и предложим возможные пути решения этой проблемы.

Проблема утечек памяти в Win64 версии Delphi

Разработчик столкнулся с проблемой утечек памяти в серверном приложении, использующем Indy TIdTCPServer и написанном на Delphi XE2. Приложение было многопоточным и подключалось к базе данных. В 32-битной версии приложения утечек памяти не наблюдалось, в то время как в 64-битной версии память увеличивалась на 20 МБ в день.

После тщательного анализа кода и использования инструментов от Microsoft для отслеживания утечек памяти, таких как DebugDiag и XPerf, разработчик пришел к выводу, что в 64-битном RTL Delphi есть фундаментальный баг, который приводит к утечкам памяти при отсоединении потока от DLL.

Репродукция проблемы

Проблема была воспроизведена на простом проекте, состоящем из хост-приложения и библиотеки, собранных в Delphi XE2. Библиотека статически связывалась с хост-приложением, которое создавало потоки, вызывающие процедуру из библиотеки и завершающие свою работу.

Код примера

Пример кода библиотеки:

library FooBarDLL;
uses
  Windows,
  System.SysUtils,
  System.Classes;
{$R *.res}
function FooBarProc(): Boolean; stdcall;
begin
  Result := True; //Do nothing.
end;
exports
  FooBarProc;

Пример кода хост-приложения:

TFooThread = class(TThread)
protected
  procedure Execute; override;
public
  constructor Create;
end;

constructor TFooThread.Create;
begin
  inherited Create(True);
  FreeOnTerminate := True;
end;

procedure TFooThread.Execute;
begin
  // Call the exported procedure.
  FooBarProc();
end;

Анализ утечек памяти

Используя инструменты отладки, разработчик выяснил, что утечки памяти происходят из-за неправильного управления памятью TLS (Thread Local Storage) при завершении потока. В коде пути, отвечающего за утечки, были обнаружены следующие функции:

  • Sysinit::AllocTlsBuffer
  • Sysinit::InitThreadTLS
  • System::AllocateRaiseFrame
  • System::DelphiExceptionHandler

Возможные решения

  1. Обновление среды разработки: Ждать выпуска новой версии Delphi, в которой утечка будет устранена.
  2. Использование пула потоков: Переиспользование потоков вместо их постоянного создания и уничтожения может помочь уменьшить утечки.
  3. Отказ от использования исключений для завершения потока: В коде, выполняемом в потоке, не следует использовать Abort для завершения работы потока. Вместо этого следует использовать Exit.

Пример кода с использованием Exit вместо Abort

procedure TFooThread.Execute;
begin
  while not Terminated do
  try
    // Ваш код
  except
    on E: Exception do
    begin
      LogTheException(E.Message);
      // Завершение потока без использования исключения
      Exit;
    end;
  end;
end;

Заключение

Утечки памяти в многопоточных серверных приложениях на Delphi могут быть серьезной проблемой, особенно в 64-битных версиях. Разработчикам важно быть в курсе текущих проблем RTL и следить за обновлениями среды разработки. При необходимости следует применять альтернативные методы управления потоками и избегать использования Abort для их завершения.

Создано по материалам из источника по ссылке.

Устранение утечек памяти в серверных приложениях Delphi с использованием 64-битного RTL, вызванных ошибками в RTL при работе в 64-битной версии и анализ методов их решения.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Память и Указатели ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 21:17:55/0.006148099899292/0