我们在其中一台客户服务器上遇到一个奇怪的问题,即Java遇到“文件太多”,

通过lsof检查描述符会产生大量“无法识别协议(protocol)”的“ socks ”描述符。

我怀疑这是由于套接字打开了太多时间而发生的,但是由于我们的线程转储包含很多套接字,因此我不清楚到底是谁造成了罪魁祸首。

有什么好的方法来检测哪些线程恰好打开了这些套接字?

谢谢。

最佳答案



不是线程本身。

一种方法是使用探查器运行应用程序。即使您不能完全重现客户的问题,也很可能会找到问题。 (@SyBer报告说,YourKit探查器对查找套接字泄漏有特定的支持……请参阅注释。)

第二种方法是通过使用ulimit减少允许的打开文件数来调整测试平台。这可能会使在测试环境中重现“打开太多文件”的情况变得更加容易。

最后,我建议“捕获”您的代码库,以找到创建套接字对象的所有位置。然后检查所有它们,以确保它们使用正确的try/finally块来确保套接字始终处于关闭状态。

10-07 12:49
查看更多