Процесс Java в Mac OSX не освобождает сокет

Время от времени я сталкиваюсь со странной проблемой (на самом деле слишком часто ).

Я запускаю серверное приложение, которое привязывает к себе сокет.

Но время от времени сокет не освобождается. Процесс умирает, хотя 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 (build 1.6.0 _31 -b04 -415 -11M3635 )Java HotSpot (TM )64 -Bit Server 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 выше означает, что процесс завершается. Я не мог найти никаких средств, чтобы полностью убить такой процесс без перезагрузки. Та же проблема была замечена с некоторыми другими приложениями. Решения не найдены:

http://www.google.com/search?q=ps+process+is+exiting+osx

12
задан Jouni Aro 10 May 2012 в 06:43
поделиться