首页 > 解决方案 > java程序中的Unix域套接字描述符泄漏

问题描述

我有一个遭受文件描述符泄漏的java程序。

lsof -p <PID> -nP显示大量指向同一个 inode 的项目。这是列表的示例:

java    16352 myprogram  354u     unix 0xffff88042805e800      0t0 1755895875 type=STREAM
java    16352 myprogram  355u     unix 0xffff88042805e800      0t0 1755895875 type=STREAM
java    16352 myprogram  356u     unix 0xffff88042805e800      0t0 1755895875 type=STREAM

然后我使用netstat -ano了,它显示 Inode 指向一个活动的 unix 域套接字。这是清单:

Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     1755939110 /tmp/.java_pid16352.tmp
unix  2      [ ]         STREAM     CONNECTED     1755871862 
unix  2      [ ]         STREAM     CONNECTED     1755895875

这是由提供的信息/proc/16352/net/unix

Num       RefCount Protocol Flags    Type St Inode Path
ffff8803d0181400: 00000002 00000000 00010000 0001 01 1755939110 /tmp/.java_pid16352.tmp
ffff880426541400: 00000002 00000000 00000000 0001 03 1755871862
ffff88042805e800: 00000002 00000000 00000000 0001 03 1755895875

我尝试了找出 unix 域套接字另一端的方法(https://unix.stackexchange.com/questions/16300/whos-got-the-other-end-of-this-unix-socketpair/190606# 190606),但lsof +E -aUc Xorg什么也没提供;ss -xp | grep 1755895875也没有提供任何内容。(我不明白“套接字由它们的 inode 编号标识。请注意,它与套接字文件的文件系统 inode 无关。”在 Stéphane Chazelas 的回答中)

请帮我找到一种方法来弄清楚:

  1. 我的 java 进程中的哪个线程不断生成那些 unix 域套接字描述符并导致文件描述符泄漏问题。
  2. 如何找出 unix 域套接字的另一个端点。

标签: javalinuxsockets

解决方案


推荐阅读