任何Java调试技巧,用于查找“打开太多文件”的原因

时间:2011-09-15 18:15:13

标签: java debugging stream filenotfoundexception

我正在开发一个Linux环境,系统打算长时间连续运行。经过一夜的测试后,我们看到FileNotFoundException,并显示“Too Many Files Open”消息。我们开始在系统中的不同时间记录lsof命令的输出,看看我们是否能看到发生了什么。我们注意到许多未命名的管道已经打开。所以我认为这些是由于文件流没有关闭。我在源代码中搜索了所使用的任何* Stream对象,并确保它们都在finally {}块中关闭。是否有任何其他我可以搜索的Java对象类型,我可能没有关闭,这会导致所有这些未命名的管道被打开?

另外,我的ulimit是1024,我也搜索了* Writer,并确保这些都关闭了。

3 个答案:

答案 0 :(得分:2)

YourKit可能值得一看。它的probes旨在帮助解决这类问题,尽管我自己从未有机会尝试过这种功能。

答案 1 :(得分:0)

我假设你的ulimit是ulimit -n的输出。 1024是生产系统中允许的相当少量的文件描述符。对于调试步骤,而不是随机运行lsof并尝试关联,为什么不捕获FileNotFound异常并运行Runtime.exec(“lsof”)并将输出打印到日志文件以获得相当准确的视图发生问题时使用了哪些文件描述符。

答案 2 :(得分:0)

可能泄漏文件描述符的其他类是FileChannelRandomAccessFile - 后者似乎甚至没有终结器,因此它的泄漏可能是永久性的。