是否有任何方法可以检测和处理Java库是否正在使用所述库的中的正确地释放文件句柄(通过“关闭”),但无法访问实际的库代码并插入相应的“最终关闭”语句?
如果检测可行,有没有办法在没有引用读取文件的Reader(或FileInputStream)的情况下关闭这些文件句柄?
答案 0 :(得分:5)
我认为Kohsuke的file leak detector非常接近所要求的(差不多4年前)。它是一个Java代理,“跟踪JVM中打开文件的位置/时间/谁。您可以让代理跟踪这些操作以了解访问模式或处理泄漏,并转储当前打开的文件列表以及/何时/谁打开他们“。以上链接中的更多信息。
答案 1 :(得分:3)
在Linux和可能的某些Unix下,您可以使用lsof
来“列出”由应用程序打开的“打开文件”。如果您的应用程序泄漏文件句柄,您可能会看到他们的数量增加。您甚至可能最终达到1024个句柄的(默认)上限。
在Windows下,SysInternals套件中有一些免费的类似工具;我认为它被称为“手柄”或“手柄”等。我会去看看能不能找到它......
System.gc()
来解决问题。当应用程序用完手柄时,性能损失相对于彻头彻尾的故障是可以容忍的。
FileInputStream
和FileReader
之类的东西上编写你自己的包装器。我相信在JRE的文件树中有一个目录名,你可以将Jars放入其中“摆弄“班级;它被称为“赞同”或类似的东西。那,或者你可以彻底改变JRE库代码的源代码,并为Sun(或其他)库构建自己的替换jar。这显然不干净或不便携。我对这些措施没有任何经验,也不会推荐它们。
答案 2 :(得分:1)
您可以在库上运行FindBugs。