有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我们有一个项目,通过Tomcat应用程序中的JacoZoom访问第三方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被终止并重新创建


共 (2) 个答案

  1. # 1 楼答案

    我假设像“不要使用那个DLL”这样明显的事情不在讨论之列

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

  2. # 2 楼答案

    我认为迈克建议你用包装纸是你真正想做的唯一方法

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

    你也可以使用LeakDiag这样的工具,看看你是否能找出漏洞的来源,并试图说服你不情愿的供应商合作

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