我正在使用第三方商业库,它似乎正在泄漏文件句柄(我使用lsof
在Linux上验证了这一点)。最终服务器(Tomcat)开始得到臭名昭着的“太多打开文件错误”,我必须重新启动JVM。
我已经与供应商联系过了。然而,与此同时,我想找到一个解决方法。我不可以访问他们的源代码。在Java中,有没有办法清理文件句柄,而无法访问原始File
对象(或FileWriter
,FileOutputStream
等)?
答案 0 :(得分:2)
一种有趣的方法是编写动态库并使用LD_PRELOAD为正在启动的java实例加载它...此DLL可以覆盖相应的底层open(2)系统调用(或使用其他逻辑)在将调用传递给libc实现(或内核)之前关闭进程的现有文件描述符。你需要做一些认真的会计,并可能处理线程;但这是可以完成的。特别是如果您从/ proc / pid / fd /中获取提示,以确定关闭是否适合目标fd。
答案 1 :(得分:0)
你可以在启动时打开一堆文件并使用File*putStream.getFD()
获取一堆java.io.FileDescriptor
s,然后关闭它们,但保留描述符。稍后您可能能够create streams使用存储的FileDescriptor
并关闭它们。
我没有测试过这个,所以如果它在某些平台上不起作用也不会感到惊讶。