java—如何解决tomcat应用程序访问的内存泄漏第三方dll(无源代码)?

h9a6wy2h  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(255)

我们有一个项目,其中第三方dll通过tomcat应用程序中的jacozoom进行访问。显然,dll泄漏内存(由供应商确认),但供应商无意修复此问题。内存泄漏迫使tomcat定期重启,这自然给用户带来很大不便。
解决这个问题的最佳方法是什么?我们考虑的一个选项是使用两个tomcat服务器示例,定期重新启动另一个示例,并将用户重定向到另一个示例。
编辑:通过创建另一个dll来解决,该dll在需要时终止并重新创建供应商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

幸运的是jacozoom jar文件似乎并不介意dll被终止并重新创建。

jqjz2hbq

jqjz2hbq1#

我假设像“不要使用那个dll”这样明显的东西不在桌面上。
你能在蹩脚的dll周围创建一个 Package 器、服务或层,可以独立地管理和重新启动,并让tomcat/jacozoom/whatever调用该服务吗?在某种意义上,将内存泄漏转移到容器外的其他应用程序?

8yparm6h

8yparm6h2#

我认为迈克建议用 Package 纸是你真正走的唯一方法。
您可以编写一个com服务器来承载第三方控件,并从应用程序访问它。当然, Package 进程仍然会泄漏,但是您可以对其进行安排,使其在没有对托管库的未完成引用时退出。
您还可以潜在地使用leakdiag之类的工具,看看是否能够找出漏洞的来源,并试图说服不情愿的供应商参与进来。
[编辑:存在->退出-谢谢标记。]

相关问题