Процесс Java на Mac OSX не освобождает сокет
Время от времени я испытываю странные проблемы (на самом деле слишком часто).
Я запускаю серверное приложение, которое привязывает сокет к себе.
Но время от времени розетка не освобождается. Процесс прекращается, хотя Eclipse сообщает, что завершение завершилось неудачно, однако оно корректно исчезает из «ps». и JConsole / JVisualVM. & APOS; Lsof & APOS; также больше ничего не отображает для порта. Но, тем не менее, я получаю эту ошибку, когда пытаюсь снова запустить сервер на тот же порт:
<code>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) </code>
Наихудшая проблема в моих модульных тестах, которые никогда не выполняются полностью, потому что это наверняка произойдет после одного из тестов (которые все воссоздают сервер).
Я использую MacOSX 10.7.3
Java (TM) SE Runtime Environment (сборка 1.6.0_31-b04-415-11M3635) Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 20.6-b01-415, смешанный режим)
У меня также есть Parallels, и часто проблема выглядит так, как будто она вызвана сетевым адаптером Parallels, но я не уверен, что он как-то связан с этой проблемой (я до сих пор связывался с их поддержкой без какой-либо помощи).
Единственное, что помогает разрешить ситуацию, это перезагрузить OSX.
Есть идеи?
--
Это соответствующий код для открытия сокета:
<code>channel = (ServerSocketChannel) ServerSocketChannel.open().configureBlocking(false); channel.socket().bind( addr, 0 ); </code>
и это закрыто
<code> channel.close(); </code>
Но я предполагаю, что процесс застревает здесь, а затем Eclipse убивает его.
--
netstat -an (для порта 6007):
<code>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 </code>
--
И теперь я получаю это исключение после открытия сокета для каждого теста (вывод netstat из этой ситуации):
<code>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) </code>
--
Остановка процесса из затмения Я получил «Завершить не удалось», но lsof -i TCP: 6007 ничего не отображает, и процесс больше не обнаруживается «ps». вывод netstat не изменился ...
Можно ли как-нибудь убить сокет без перезагрузки (это уже помогло бы немного)?
--
ОБНОВЛЕНИЕ 5.5.12:
Сейчас я запускал тесты в отладчике Eclipse. На этот раз тесты застряли после 18 методов. Я остановил основной поток после того, как он застрял около 15 минут. Это стек:
<code>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 ... </code>
--
Хм, похоже, что процесс не уничтожен, в конце концов - и не умирает, чтобы убить -9 (я заметил, что процесс 712 и, вероятно, также 710 являются процессами TestNG):
<code>$ 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 </code>
-- Edit: 10.5.12:
? E в выводе ps выше означает, что процесс завершается. Я не мог найти никаких средств, чтобы полностью убить такой процесс без перезагрузки. Та же проблема была замечена с некоторыми другими приложениями. Решений не найдено: