Java NIO вызывает утечку файлового дескриптора

У нас есть http-сервер, который реализован на основе Java NIO. Он работает на Ubuntu 10.04.2 LTS с java-версией "1.6.0_20" Java(TM) SE Runtime Environment (сборка 1.6.0_20-b02) Серверная виртуальная машина Java HotSpot(TM) (сборка 16.3-b01, смешанный режим)

Тем не менее, он пропускает файловые дескрипторы, все они являются сокетами домена Unix.

При использовании команды "netstat -anp" мы можем обнаружить, что процесс открывает только два сокета домена unix. Однако при использовании lsof -p мы можем обнаружить, что существует огромное количество файловых дескрипторов, которые являются сокетом домена unix и имеют то же значение устройства и значение узла, что и значение, найденное в netstat.

Я проверил наш код, и все SocketChannels закрыты должным образом.

Это ошибка Sun JDK? Как мы можем это исправить?

2 ответа

Решение

Коренная причина найдена. В нашем коде, когда мы закрываем socketchannel, мы также отменяем ключ. Проблема в том, что: Мы отменяем ключ в потоке выбора и закрываем канал сокета в другом потоке b. Канал сокета закрыт до вызова key.cancel.

Читая реализацию close и cancel, мы можем обнаружить, что сокет домена unix открывается dup2 и никогда не закрывается несколько раз (одновременная проблема).

Я считаю, что селекторы используют доменные сокеты Unix. Ты их закрываешь?

Другие вопросы по тегам