在Java中检测和处理第三方库文件句柄泄漏

时间:2010-04-23 18:54:21

标签: java file

是否有任何方法可以检测和处理Java库是否正在使用所述库的中的正确地释放文件句柄(通过“关闭”),但无法访问实际的库代码并插入相应的“最终关闭”语句?

如果检测可行,有没有办法在没有引用读取文件的Reader(或FileInputStream)的情况下关闭这些文件句柄?

3 个答案:

答案 0 :(得分:5)

我认为Kohsuke的file leak detector非常接近所要求的(差不多4年前)。它是一个Java代理,“跟踪JVM中打开文件的位置/时间/谁。您可以让代理跟踪这些操作以了解访问模式或处理泄漏,并转储当前打开的文件列表以及/何时/谁打开他们“。以上链接中的更多信息。

答案 1 :(得分:3)

在Linux和可能的某些Unix下,您可以使用lsof来“列出”由应用程序打开的“打开文件”。如果您的应用程序泄漏文件句柄,您可能会看到他们的数量增加。您甚至可能最终达到1024个句柄的(默认)上限。

在Windows下,SysInternals套件中有一些免费的类似工具;我认为它被称为“手柄”或“手柄”等。我会去看看能不能找到它......


编辑:啊,这是:Handle


编辑:我最近遇到了与套接字(它们也是一种文件句柄,至少在Linux下)的类似,模糊的问题:原来,即使连接已关闭,在Java执行垃圾收集之前,不会释放关联的文件句柄。我们的应用程序没有经历大量内存,因此连接句柄通常会比清理时更快堆积。我们偶尔插入System.gc()来解决问题。当应用程序用完手柄时,性能损失相对于彻头彻尾的故障是可以容忍的。


编辑:在更高级别,JRE的库当然是“仅”Java代码,源代码仍然是AFAIK发布。所以,如果你真的绝望,你可以在FileInputStreamFileReader之类的东西上编写你自己的包装器。我相信在JRE的文件树中有一个目录名,你可以将Jars放入其中“摆弄“班级;它被称为“赞同”或类似的东西。那,或者你可以彻底改变JRE库代码的源代码,并为Sun(或其他)库构建自己的替换jar。这显然不干净或不便携。我对这些措施没有任何经验,也不会推荐它们。

答案 2 :(得分:1)

您可以在库上运行FindBugs。