Время от времени я сталкиваюсь со странной проблемой (на самом деле слишком часто).
Я запускаю серверное приложение, которое привязывает сокет к себе.
Но время от времени сокет не освобождается. Процесс умирает, хотя Eclipse сообщает, что Terminate не удалось, однако он правильно исчезает из «ps» и JConsole/JVisualVM. 'lsof' также больше ничего не отображает для порта. Но все же я получаю эту ошибку, когда пытаюсь снова запустить сервер на тот же порт:
Caused by: java.net.BindException: Address already in use
at sun.nio.ch.Net.bind(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:126)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:59)
Проблема усугубляется в моих модульных тестах, которые никогда не выполняются полностью, потому что это наверняка произойдет после одного из тестов (которые все воссоздают сервер).
Я использую MacOSX 10.7.3.
Java(TM) SE Runtime Environment (сборка 1.6.0_31-b04-415-11M3635) Java HotSpot(TM) 64-битный сервер VM (сборка 20.6-b01-415, смешанный режим)
У меня также есть Parallels, и часто проблема выглядит так, как будто она вызвана сетевым адаптером Parallels, но я не уверен, имеет ли это какое-то отношение к этой проблеме (пока я связался с их службой поддержки без какой-либо помощи).
Единственное, что помогает разрешить ситуацию, это перезагрузка OSX.
Любые идеи?
--
Это соответствующий код для открытия сокета:
channel = (ServerSocketChannel) ServerSocketChannel.open().configureBlocking(false);
channel.socket().bind( addr, 0 );
и он закрыт
channel.close();
Но я предполагаю, что процесс здесь зависает, а затем Eclipse его убивает.
--
netstat -an (для порта 6007):
tcp4 73 0 127.0.0.1.6007 127.0.0.1.51549 ESTABLISHED
tcp4 0 0 127.0.0.1.51549 127.0.0.1.6007 ESTABLISHED
tcp4 73 0 127.0.0.1.6007 127.0.0.1.51544 CLOSE_WAIT
tcp4 0 0 127.0.0.1.6007 127.0.0.1.51543 CLOSE_WAIT
tcp4 0 0 10.37.129.2.6007 *.* LISTEN
tcp4 0 0 10.211.55.2.6007 *.* LISTEN
tcp4 0 0 127.0.0.1.6007 *.* LISTEN
tcp4 0 0 10.50.100.236.6007 *.* LISTEN
--
И теперь я получаю это исключение после открытия сокета для каждого теста (вывод netstat из этой ситуации):
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.net.SocketInputStream.read(SocketInputStream.java:182)
--
Остановив процесс из eclipse, я получил «Ошибка завершения», но lsof -i TCP: 6007 ничего не отображает, и процесс больше не обнаруживается с помощью «ps». вывод netstat не изменился...
Можно ли как-то убить сокет без перезагрузки (это уже немного помогло бы)?
--
ОБНОВЛЕНИЕ 5.5.12:
Сейчас я провел тесты в отладчике Eclipse. На этот раз тесты застряли после 18 методов. Я остановил основной поток после того, как он застрял примерно на 15 минут. Это стек:
Thread [main] (Suspended)
FileDispatcher.preClose0(FileDescriptor) line: not available [native method]
SocketDispatcher.preClose(FileDescriptor) line: 41
ServerSocketChannelImpl.implCloseSelectableChannel() line: 208 [local variables unavailable]
ServerSocketChannelImpl(AbstractSelectableChannel).implCloseChannel() line: 201
ServerSocketChannelImpl(AbstractInterruptibleChannel).close() line: 97
...
--
Хм, похоже, процесс ведь не убивается — и не умирает, чтобы убить -9 тоже (я заметил, что процесс 712 и, вероятно, тоже 710 — это процессы TestNG):
$ kill -9 712
$ ps xa | grep java
700 ?? ?E 0:00.00 (java)
712 ?? ?E 0:00.00 (java)
797 s005 S+ 0:00.00 grep java
-- Редактировать: 10.5.12:
?E в приведенном выше выводе ps означает, что процесс завершается. Я не мог найти никаких средств, чтобы полностью убить такой процесс без перезагрузки. Та же проблема была замечена с некоторыми другими приложениями. Решений не найдено:
netstat -an
сразу после того, как тест не сможет определить, находится ли сокет в состоянииTIME_WAIT
. - person JeremyP   schedule 25.04.2012kill -9
его. в качестве альтернативы вы запускаете виртуальную машину в Linux и можете использовать eclipse для отладки. - person bestsss   schedule 05.05.2012Selector.select()
, был разбужен и завершился? - person Sam Goldberg   schedule 10.05.2012