我们在其中一台客户服务器上遇到一个奇怪的问题,即Java遇到“文件太多”,
通过lsof检查描述符会产生大量“无法识别协议(protocol)”的“ socks ”描述符。
我怀疑这是由于套接字打开了太多时间而发生的,但是由于我们的线程转储包含很多套接字,因此我不清楚到底是谁造成了罪魁祸首。
有什么好的方法来检测哪些线程恰好打开了这些套接字?
谢谢。
最佳答案
不是线程本身。
一种方法是使用探查器运行应用程序。即使您不能完全重现客户的问题,也很可能会找到问题。 (@SyBer报告说,YourKit探查器对查找套接字泄漏有特定的支持……请参阅注释。)
第二种方法是通过使用ulimit
减少允许的打开文件数来调整测试平台。这可能会使在测试环境中重现“打开太多文件”的情况变得更加容易。
最后,我建议“捕获”您的代码库,以找到创建套接字对象的所有位置。然后检查所有它们,以确保它们使用正确的try/finally块来确保套接字始终处于关闭状态。