【发布时间】:2015-09-01 13:10:04
【问题描述】:
我有一个Java程序平均运行2周后会卡住并产生以下错误:
Caused by: java.net.SocketException: Too many open files
at sun.nio.ch.Net.socket0(Native Method)
at sun.nio.ch.Net.socket(Net.java:415)
at sun.nio.ch.Net.socket(Net.java:408)
at sun.nio.ch.SocketChannelImpl.<init>(SocketChannelImpl.java:105)
这向我暗示了许多套接字已打开但从未关闭。 在深入研究编程仪器之前,我开始检查我可以从 linux 本身获取哪些信息。我正在使用 Redhat。
然后,出现了如下几个问题:
- 为什么以下命令没有给出相同的输出?
见
[ec2-user@ip-172-22-28-102 ~]$ sudo ls /proc/32085/fd | wc -l
592
[ec2-user@ip-172-22-28-102 ~]$ sudo lsof -a -p 32085 | wc -l
655
- 有没有办法从 proc stat 信息中知道哪个线程创建了哪个文件描述符?
似乎没有,因为如果我执行以下操作,我会得到相同的信息:
[ec2-user@ip-172-22-28-102 ~]$ sudo ls /proc/32085/task/22386/fd | wc -l
592
[ec2-user@ip-172-22-28-102 ~]$ sudo ls /proc/32085/fd | wc -l
592
如果我直接从 /proc/ 下进入线程,则相同。
谢谢
【问题讨论】: