【问题标题】:file descriptor leak in java program : too many open filesjava程序中的文件描述符泄漏:打开的文件太多
【发布时间】:2010-10-24 22:08:06
【问题描述】:

我有一个文件描述符增加的程序。 我看到当我执行命令 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]

请帮助我找到解决此文件描述符泄漏的方法,以了解哪些文件保持打开状态并增加文件描述符数。

【问题讨论】:

    标签: java file memory-leaks file-descriptor


    【解决方案1】:

    好吧,从快速观察来看,您在套接字上使用文件描述符,而不是文件

    在 UNIX 中,文件和套接字都使用文件描述符,因此您会遇到一个问题,即您没有关闭打开的套接字。

    因此,您并没有打开文件,而是实际上将端口号锁定以不被其他程序使用。

    【讨论】:

    • 他绑定的不只是端口号。在 UNIX / Linux 中,进程只允许打开一定数量的 fd(文件描述符),无论是文件 fd、套接字 fd、管道 fd 还是其他。
    • 我不确定我正在使用套接字并且我的端口号已锁定。
    • 您知道一种方法可以查看哪些打开的文件保持打开状态,以查看我让文件打开的位置吗?
    • @zacky,你需要阅读我的帖子。 没有打开的文件。无论您是使用 3rd 方库还是进行任何网络编程,事实仍然是根据您发布的内容,没有打开文件
    • @zacky,研究 unix 套接字。请。它们在端口上运行,而不是 URL。您拥有找到答案所需的一切。
    【解决方案2】:

    试试

    # lsof -p <pid>
    

    将列出所有由进程 ID 打开的“文件”,可能会显示套接字绑定到的 IP/端口。如果您的程序是客户端,您可能会被 TCP RST 断开连接并且没有正确清理文件描述符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2015-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      相关资源
      最近更新 更多