Как обойти утечку памяти сторонней DLL (без исходного кода), к которой обращается приложение Tomcat? - PullRequest
2 голосов
/ 02 ноября 2009

У нас есть проект, где сторонняя DLL-библиотека доступна через JacoZoom в приложении Tomcat. Очевидно, DLL утечки памяти (подтверждено поставщиком), но поставщик не намерен это исправить. Утечка памяти вынуждает Tomcat регулярно перезагружаться, что, естественно, является большим неудобством для пользователей.

Как лучше всего обойти эту проблему? Один из вариантов, который мы рассматриваем, - иметь два экземпляра сервера Tomcat и регулярно перезагружать другой, а также перенаправлять пользователя на другой.

Редактировать: решается путем создания другой библиотеки DLL, которая при необходимости убивает и воссоздает библиотеку поставщика. В основном эти три вызова kernel32 были использованы для реализации функциональности:


Private Declare Function GetModuleHandle Lib "kernel32.dll" Alias "GetModuleHandleW" (ByVal DllName As Long) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long

К счастью, JAR-файл JacoZoom, похоже, не против того, чтобы DLL была уничтожена и воссоздана.

Ответы [ 2 ]

5 голосов
/ 02 ноября 2009

Я предполагаю, что очевидных вещей, таких как "не используйте эту DLL", нет на столе.

Можете ли вы создать оболочку, сервис или слой вокруг дрянной DLL, которой можно управлять и перезапускать независимо, и вместо этого Tomcat / Jacozoom / любой другой вызовет эту службу? В каком-то смысле, перемещение утечки памяти в какое-либо другое приложение за пределами контейнера?

2 голосов
/ 02 ноября 2009

Я думаю, что предложение Майка об использовании обертки - единственный способ для вас.

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

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

[Редактировать: существует-> выходит - Спасибо, Марк.]

...