我们的java应用程序正在抛出太多打开的文件"运行很长时间后发出问题。 调试问题后,可以看到根据lsof输出打开了很多fds。
# lsof -p pid | grep "pipe" | wc -l
698962
# lsof -p pid | grep "anon_inode" | wc -l
349481
--------------很少有数据-----------
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 23994 app 464u 0000 0,9 0 3042 anon_inode
java 23994 app 465u 0000 0,9 0 3042 anon_inode
java 23994 app 466r FIFO 0,8 0t0 962495977 pipe
java 23994 app 467w FIFO 0,8 0t0 962495977 pipe
java 23994 app 468r FIFO 0,8 0t0 963589016 pipe
java 23994 app 469w FIFO 0,8 0t0 963589016 pipe
java 23994 app 470u 0000 0,9 0 3042 anon_inode
java 23994 app 471u 0000 0,9 0 3042 anon_inode
如何找到FIFO和0000类型的许多开放FD的根本原因。
我们的应用程序中没有很多文件读/写。使用内部使用Nio的apache mina框架从流中读取了如此多的TCP消息。
这些是我的问题
答案 0 :(得分:1)
最可能的是你打开资源然后没有正确关闭它们。确保使用适当的方法,例如try-with-resources或try-finally块来整理。
要找到问题,您应该通过类路由所有IO,然后跟踪打开和关闭,甚至可能记住堆栈跟踪。然后,您可以查询并查看资源泄漏的位置。
答案 1 :(得分:1)
我们发现了这个问题。有一个代码流,其中创建了org.apache.mina.transport.socket.nio.NioSocketConnector,但在某些情况下没有关闭。为了找到问题,我们做了以下