Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Утечка памяти COM сервера реализованного на Delphi 4-7.


MMax ©   (2003-07-24 04:30:00) 

Утечка памяти COM сервера реализованного на Delphi 4-7.
Кто натыкался на этот подводный камень?
Создаю сервер. File->New->Automation Server->“MemLeakAutoServ” (Multiple Instance, Apartament).
Затем создаю клиент. Project->ImportType Library-> MemLeakAutoServ.
Затем запускаю следующий код:
Procedure TclassName.OnTimer; Begin
MemLeakAutoServ.Connect;
MemLeakAutoServ.DisConnect;
End;
Через 30 минут сервер “MemLeakAutoServ” раздувается до 256 мегабайт.
Заранее благодарен за ответ.


MMax   (2003-07-31 07:26:00) [1]

  Спасибо за ответы.
Благодаря ним разобрался с утечкой памяти.

Дело было в менеджере памяти.
Библиотека BORLNDMM.DLL использовалась от Borland C++ Builder 5.

  С корректной библиотекой утечки памяти нет.


Набережных С.   (2003-07-29 17:25:00) [2]

>MMax   (29.07.03 04:30)

Извини, я не имел в виду ничего обидного, но вышло неудачно - очень уж большое впечатление произвели приведенные цифры:) Рост памяти имеет место и, насколько я могу судить, связан именно с менеджером. Однока, приведенная величина уж чересчур. Вот сейчас сделал  похожий на твой тест с коннектом через ADO к .mdb. При первом коннекте память выросла примерно с 400кб до 4мб, затем подросла до ~4,5 и стабилизировалась. Могу только повторить, что следует избегать работы с AnsiString. Конфигурация примерно такая-же - W2 Pro, Delphi, студия...и много чего - но это и не особо важно. Боюсь, что все-таки у тебя не все чисто.


MMax   (2003-07-29 04:30:00) [3]

  Привет городу Новосибирск.
Конечно, ошибка возможно и дилетантская, но на то и форумы.
На них и решаются такие вопросы.

Почему в книге от издательства “Sams” в примере Клиент-сервера аналогичная утечка памяти. Аналогичную ошибку наблюдал и в Delhpi  примерах.

Может дело в используемых Dll?
На машине (OS 2000 Server) установлены пакеты: VC++, Builder C++, Delphi, VB.
Хотя на другой машине под NT 4.0 ошибки повторяются.

Пока нашел выход писать сервер на С++ Builder, а клиенты на Delphi.
Ошибок нет, только сервер стал компактнее и шустрее.

Подскажите где можно найти пример Клиент-сервера COM (OPC или чат) написанного на Delphi.


Набережных С.   (2003-07-25 18:23:00) [4]

Не надо ничего перегружать - при осмысленном использовании предопределенных классов. Рост захваченной памяти обусловлен особенностями дельфийского менеджера памяти. Особенно это проявляется при работе с AnsiString. Лучший выход тут - исподьзование свокго менеджера, учитывающего особенности конкретного серверного приложения. Однако, указанный размер утечек наводит на мысль о чисто дилетантских причинах. Ищи ошибки у себя.


MMax   (2003-07-25 06:21:00) [5]

    Спасибо за ответ.
На стороне клиента невозможно высвободить память сервера.

MemLeakAutoServ := nil;  не помогает

В Королевстве Delphi мною был получен следующий ответ:
  Необходимо перегрузить серверный метод DisConnect.

Здесь нужно лесть в дебри реализации COM на Delphi.

Если, кто имеет примеры Client Server (Automation Server Multiple Instance) на Delphi без утечки памяти большая просьба скинуть их на Mednikovm@mail.ru

Могу поделиться примерами реализации обратных вызовов на Builder C++.


clickmaker   (2003-07-24 12:45:00) [6]

В принципе, для уничтожения экземпляра серверного объекта нужно сказать что-то типа MemLeakAutoServ := nil; (или Null, если MemLeakAutoServ объявлен как Variant)


MMax   (2003-07-24 11:46:00) [7]

 Этот сервер поставляет архивные данные клиентам.
Данные берутся с MySQL сервера.
 Сервер был мною переписан на C++ Builder.
 Как ни странно в  C++ Builder вопроса об очистке памяти не стоит.

На будущее хотелось бы знать, как осуществлять очистку памяти за COM клиентами в Delphi.


clickmaker   (2003-07-24 10:44:00) [8]

А что делает этот сервер?


Наверх

Титульная страница Поиск, карта сайта Написать письмо