Java 如何处理Tomcat应用程序访问的内存泄漏第三方DLL(无源代码)?

Java 如何处理Tomcat应用程序访问的内存泄漏第三方DLL(无源代码)?,java,dll,tomcat,memory-leaks,Java,Dll,Tomcat,Memory Leaks,我们有一个项目,通过Tomcat应用程序访问第三方DLL。显然DLL泄漏内存(由供应商确认),但供应商无意修复此问题。内存泄漏迫使Tomcat定期重启,这自然给用户带来了极大的不便 解决这个问题的最佳方法是什么?我们考虑的一个选择是拥有Tomcat服务器的两个实例,并定期重新启动另一个实例,并将用户重定向到另一个。 编辑:通过创建另一个DLL解决,该DLL在需要时终止并重新创建供应商DLL。基本上,这三个kernel32调用用于完成功能: Private Declare Function Ge

我们有一个项目,通过Tomcat应用程序访问第三方DLL。显然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被删除并重新创建。

我假设“不要使用该DLL”之类的明显内容不在表中


你能不能在蹩脚的DLL周围创建一个包装器、服务或层,可以独立地管理和重新启动,并让Tomcat/Jacozoom/which调用该服务?从某种意义上说,将内存泄漏转移到容器外的其他应用程序?

我认为Mike建议使用包装器是唯一可行的方法

您可以编写一个承载第三方控件的COM服务器,并从应用程序访问它。包装进程当然仍然会泄漏,但您可以对其进行安排,使其在没有对托管库的未完成引用时退出

您还可以潜在地使用LeakDiag之类的工具,看看是否能够找出漏洞的来源,并尝试说服不情愿的供应商采取行动


[编辑:存在->退出-谢谢标记。]

不使用DLL不是一个选项:)创建一个额外的包装器可能是一个可行的选择,比问题中提到的粗糙的Tomcat解决方案要优雅一些。打字错误当没有未完成的引用时,它将“退出”而不是“存在”