Странная утечка сетевых сокетов в приложении Java - PullRequest
2 голосов
/ 19 декабря 2010

Я пытаюсь обнаружить утечку сетевого сокета в нашем Java-демоне, который выдает довольно странный вывод в lsof:

java    11734 root  463u  IPv6          225927527                TCP 192.168.254.1:http->192.168.254.1:46149 (CLOSE_WAIT)
java    11734 root  464u  IPv6          225927347                TCP 192.168.254.1:http->192.168.254.1:46102 (CLOSE_WAIT)
java    11734 root  465u  IPv6          225928791                TCP 192.168.254.1:http->192.168.254.1:46451 (CLOSE_WAIT)
java    11734 root  466u  IPv6          225927617                TCP 192.168.254.1:http->192.168.254.1:46170 (CLOSE_WAIT)
java    11734 root  467u  IPv6          225930330                TCP 192.168.254.1:http->192.168.254.1:57333 (CLOSE_WAIT) 

И так далее, пока он не съест все доступные дескрипторы и не приведет к ошибке «Too many files».

Есть идеи, что может вызвать это?

Заранее спасибо!

1 Ответ

3 голосов
/ 20 декабря 2010

CLOSE_WAIT означает, что соединение было закрыто удаленным узлом, но сокет ожидает закрытия локальным приложением.Таким образом, вы этого не делаете.

Вам необходимо проверить, что вы правильно обрабатываете EOS, то есть закрыв сокет, при любых обстоятельствах, где он может возникнуть, и то же самое IOExceptions в любой операции сокета - вы должныответьте на все из них, кроме SocketTimeoutException, закрыв сокет.Вы также должны убедиться, что сокеты закрыты в finally блоках.

...