我可以关闭由我不拥有的代码打开的文件句柄吗?

时间:2011-11-16 19:10:15

标签: java io

我正在使用第三方商业库,它似乎正在泄漏文件句柄(我使用lsof在Linux上验证了这一点)。最终服务器(Tomcat)开始得到臭名昭着的“太多打开文件错误”,我必须重新启动JVM。

我已经与供应商联系过了。然而,与此同时,我想找到一个解决方法。我可以访问他们的源代码。在Java中,有没有办法清理文件句柄,而无法访问原始File对象(或FileWriterFileOutputStream等)?

2 个答案:

答案 0 :(得分:2)

一种有趣的方法是编写动态库并使用LD_PRELOAD为正在启动的java实例加载它...此DLL可以覆盖相应的底层open(2)系统调用(或使用其他逻辑)在将调用传递给libc实现(或内核)之前关闭进程的现有文件描述符。你需要做一些认真的会计,并可能处理线程;但这是可以完成的。特别是如果您从/ proc / pid / fd /中获取提示,以确定关闭是否适合目标fd。

答案 1 :(得分:0)

你可以在启动时打开一堆文件并使用File*putStream.getFD()获取一堆java.io.FileDescriptors,然后关闭它们,但保留描述符。稍后您可能能够create streams使用存储的FileDescriptor并关闭它们。

我没有测试过这个,所以如果它在某些平台上不起作用也不会感到惊讶。