java程序中的文件描述符泄漏:打开的文件太多
我有一个程序,其文件描述符不断增加。 我看到当我执行命令 ls -l /proc/5969/fd 时,其中 5969 是 java 程序的 pid,文件描述符的数量不断增加。 但我无法打开这些文件描述符之一来查看哪些文件保持打开状态: 这是列表的示例:
lrwx------ 1 root root 64 oct 24 16:08 52295 -> socket:[2577706264]
lrwx------ 1 root root 64 oct 24 16:08 52296 -> socket:[2579543392]
lrwx------ 1 root root 64 oct 24 16:08 52297 -> socket:[2578760962]
请帮助我找到一种方法来解决此文件描述符泄漏,了解哪些文件保持打开状态并增加文件描述符编号。
I have a program which suffer from file descriptor increasing.
I see when I execute the command ls -l /proc/5969/fd where 5969 is the pid of the java program the number of file descriptor continuously increasing.
but I am unable to open one of those files decriptors to see what file remains open :
here is an example of the listing :
lrwx------ 1 root root 64 oct 24 16:08 52295 -> socket:[2577706264]
lrwx------ 1 root root 64 oct 24 16:08 52296 -> socket:[2579543392]
lrwx------ 1 root root 64 oct 24 16:08 52297 -> socket:[2578760962]
Please help me finding a way to solve this file descriptor leak in knowing what files remains open and increase the file descriptor number.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
好吧,从快速观察来看,您在套接字上使用文件描述符,而不是文件。
在 UNIX 中,文件和套接字都使用文件描述符,因此您会遇到一个问题,即您没有关闭打开的套接字。
因此,您并没有让文件保持打开状态,而是实际上锁定了端口号,以防止其他程序使用。
Well, from a quick observation, you are using file descriptors on sockets, not files
In UNIX, both files and sockets use file descriptors, and so you have a problem where you are not closing sockets that you open.
As a result, you are not leaving a file open but are actually leaving port numbers locked from use by other programs.
Try
将列出按进程 ID 打开的所有“文件”,可能会显示套接字绑定到的 IP/端口。如果您的程序是客户端,您可能会被 TCP RST 断开连接并且无法正确清理文件描述符。
Try
will list all 'files' open by process id, may show you the ip/port the socket was bound to. If your program is client side, youre probably getting disconnected by TCP RST and not cleaning up the file descriptor properly.