Как устранить ошибку «java.net.BindException: адрес уже используется: JVM_Bind»?


187

В Eclipse я получил эту ошибку:

run:
     [java] Error creating the server socket.
     [java] Oct 04, 2012 5:31:38 PM cascadas.ace.AceFactory bootstrap
     [java] SEVERE: Failed to create world : java.net.BindException: Address already in use: JVM_Bind
     [java] Java Result: -1
BUILD SUCCESSFUL
Total time: 10 seconds

Я не уверен, почему он появился сейчас, но он работал нормально всего несколько часов назад. Нужно ли перезагрузить мою машину? Как мне добраться до сути? Я ценю любые советы или рекомендации.


1
Я часто видел это на компьютерах разработчиков, когда вы запускаете пробные версии кода. Как избежать этой проблемы?
будет

Ответы:


141

Да, у вас есть другой процесс, связанный с тем же портом.

TCPView (только для Windows) из Windows Sysinternals - мое любимое приложение, когда у меня возникает ошибка JVM_BIND. Он показывает, какие процессы прослушивают какой порт. Он также предоставляет удобное контекстное меню, чтобы либо убить процесс, либо закрыть мешающее соединение.


быстрое решение: откройте представление сервера> дважды щелкните по серверу> измените номера используемых портов (т. е. для администратора Tomcat, HTTP / 1.1 и AJP / 1.3)
Adrien Be

2
@novice_developer netstat- это команда, которую вы ищете, с опциями -a и -p, man netstatэто ваш друг для всех остальных :)
sox с Моникой

1
Если вышеуказанный процесс не работает, то перезагрузите компьютер один раз, я думаю, что он будет работать. Это начало работать в моем случае.
Кумар,

195

Если вы знаете , какой порт процесс запущен, можно ввести: lsof -i:<port>.

Например, lsof -i:8080чтобы перечислить процесс (pid), запущенный на порте 8080.

Затем убить процесс с kill <pid>


4
Да, это Linux. Тогда попробуйте что-нибудь эквивалентное в Windows. Может быть, это может помочь: stackoverflow.com/questions/15708/lsof-equivalent-for-windows
Диего Пино

1
поэтому я использую Raspbian и он говорит: bash: lsof: команда не найдена. какие-либо предложения?
Мона Джалал

1
@MonaJalal хммм не уверен, но, может быть, попробовать что-то вродеsudo apt-get install lsof
кофе

@DiegoPino Я столкнулся с той же ошибкой, java.net.BindException: Address already in use (Bind failed) которую использовал lsof -i:8080и получил tcp6 0 0 :::8080 :::* LISTEN 106872/java. Что я должен делать ? Убить яву ??
Авижит Баруа

@AvijitBarua Идентификатор процесса (pid) Java-программы, связанной с этим портом, - 106872. Каждая запускаемая Java-программа представляет собой java-программу (это виртуальная машина java, которая выполняет ваш скомпилированный код). Так что да, вы можете выйти или убить эту Java-программу, если это не какой-то критический (системный) инструмент, а ваша собственная программа; посмотреть в диспетчере задач, как htop. Может быть, вы пытаетесь привязать порт, используемый действующей программой, которую нельзя уничтожать.
xuiqzy

114

В окнах

netstat -ano

перечислит все протоколы, порты и процессы прослушивания. использование

taskkill -pid "proces to kill" /f

убить процесс прослушивания порта. например

 taskkill -pid 431 /f

10
netstat -ano | найти «номер вашего порта» Используйте это в Windows для конкретного порта.
BlondCode

Для меня (с использованием Windows 10) findне работает, но findstrсделал. Чтобы избежать ложных срабатываний, это также помогает добавить двоеточие, например netstat -ano | findstr :8080. Сделав это - допустим, он вернул PID 1234 - если вы затем захотите посмотреть название этого процесса, это можно сделать через tasklist /fi "pid eq 1234".
Стив Чамберс

34

В Mac:

Убить процесс Терминал:kill <pid>

Найти pid: Терминал:lsof -i:<port>

От Диего Пино отвечу


11
kill <pid> не работал на Mac, kill -9 <PID> работал со мной
Сэми Омар

33

В Ubuntu / Unix мы можем решить эту проблему в 2 этапа, как описано ниже.

  1. Тип netstat -plten |grep java

    Это даст вывод, похожий на:

    tcp   0   0 0.0.0.0:8080   0.0.0.0:*  LISTEN   1001  76084  9488/java       

    Вот 8080номер порта, на котором слушает java-процесс, и 9488его идентификатор (pid).

  2. Чтобы освободить занятый порт, мы должны убить этот процесс с помощью killкоманды.

    kill -9 9488

    9488это идентификатор процесса из ранее. Мы используем, -9чтобы принудительно остановить процесс.

Теперь ваш порт должен быть свободен, и вы можете перезагрузить сервер.


Я настраиваю сервер CentOs в цифровом океане. Если я убью этот процесс, как я могу снова запустить сервер?
Авиджит Баруа

Используйте -9 только в том случае, если это ваша собственная программа, и у вас нет данных, которые можно там потерять. Это нечисто убивает процесс, -15 говорит программе выйти из себя.
xuiqzy

27

(Только для Windows)

Чтобы убить процесс, сначала нужно найти идентификатор процесса (pid).

Запустив команду:

netstat -ano | findstr :yourPortNumber

Как показано на рисунке ниже

Вы получите свой Идентификатор процесса (PID). Чтобы убить тот же процесс, выполните следующую команду:

taskkill /pid yourid /f

введите описание изображения здесь


7

У вас есть другой процесс, запущенный на том же порту.

Вы можете попытаться убить одну из служб java.exe, запущенных в вашем диспетчере задач - ps убедитесь, что вы не уничтожили eclipse, поскольку он также указан как java.exe. Если ничего не работает, перезапуск вашей машины все равно исправит это. Похоже, вы не закрыли сокет из предыдущего теста. Надеюсь это поможет.


6

Для тех, кто ищет самый простой из ответов (поскольку это то, что мы обычно упускаем), просто остановите запущенный проект и запустите его снова. В большинстве случаев мы забываем остановить проект, который запускали ранее, и при повторном запуске проекта возникает такая проблема.

Я также прилагаю фотографию, чтобы сделать ее более понятной (я использую 'Spring tool suite'). Так что вам нужно либо нажать кнопку справа, если вы хотите перезапустить тот же проект, либо сначала нажать кнопку, расположенную на 2-й позиции справа, чтобы остановить ваш проект, а затем кнопку слева, чтобы запустить ваш проект. Я надеюсь, что это решит проблему немногих из новых программистов. :)

введите описание изображения здесь


4

В строке Windows CMD найдите идентификатор процесса, который удерживает соединение через порт привязки, введя следующую команду:

C:> netstat -a -o

-а показать все соединения

-о показать идентификатор процесса

И затем прекратить процесс.


2

Да, как сказал Гвидо Симоне, потому что другой процесс прослушивает тот же порт. Если вы находитесь в Ubuntu, вы можете просто убить этот процесс, дав команду sudo kill $(sudo lsof -t -i:[port number])

например: sudo kill $(sudo lsof -t -i:8080)

Но однажды это не сработало для меня. я дал команду

$ lsof -i:[port] 

и это ничего не показывает.

Я проверил свои контейнеры docker ps -aдокеров с помощью команды, но ни один из них не остался в живых. Все контейнеры остановились (но я помню, я остановил один контейнер, который использовал тот же порт несколько минут назад.). Чтобы убедиться, что докер не является причиной, я остановил весь Докер процесс с помощью команды sudo service docker stopи попробуйте снова. Удивительно, но затмение не показывало ошибку в то время. Она отлично запускала мою программу.

Надеюсь, мой опыт кому-нибудь поможет.



1

Порт уже используется каким-то другим процессом, так как @Diego Pino сказал, что вы можете использовать lsof в unix, чтобы найти процесс и уничтожить соответствующий, если вы находитесь в Windows, используйте netstat -ano, чтобы получить все pid процесса и порты, которые каждый приобретает. ищи нужный порт и убей.

чтобы было очень просто перезагрузить машину, если это возможно :)


1

Перезагрузите компьютер один раз, я думаю, что он будет работать. Это начало работать в моем случае. Еще одну вещь можно сделать, перейдите в диспетчер задач и завершите процесс.

Скриншот для справки.


Пожалуйста, не отвечайте с комментарием / вопросом. Было бы предпочтительнее, если вы удалили это.
Клийстерс

1

В моем случае Tomcat работал в фоновом режиме. Я установил его как внешний сервлет при использовании Eclipse. С помощью Spring Boot в Intellij у него есть собственный сервер, но он не может запуститься, пока он уже занят.
В моем случае Tomcat запускается автоматически, я включаю свою ОС, поэтому мне нужно выключить его вручную:

$ sudo service tomcat stop

Конечно, "Tomcat" зависит от того, какую версию Tomcat вы используете.
Надеюсь, это может кому-то помочь.


0

Я столкнулся с подобной проблемой в Eclipse, когда две консоли были открыты, когда я сначала запустил программу Server, а затем программу Client. Раньше я останавливал программу в единственной консоли, думая, что она закрыла сервер, но закрыла только клиент, а не сервер. Я нашел запущенные процессы Java в моем диспетчере задач. Эта проблема была решена путем закрытия программ сервера и клиента из их отдельных консолей (Eclipse показывает консоль последней активной программы). Поэтому, когда я снова запустил серверную программу, порт снова был открыт для захвата.


0

Ваш порт должен быть занят каким-то другим процессом. Таким образом, вы можете скачать TCPView на https://technet.microsoft.com/en-us/sysinternals/bb897437 и завершить процесс для используемого порта.

Если вы не знаете свой порт, дважды щелкните по серверу, который не запускается, нажмите «Открыть страницу свойств сервера» и нажмите «Glassfish» в левом столбце. Вы найдете порты здесь.


0

(1) проверить, используется порт или нет, убить этот процесс

$ lsof -i: [порт]

(2) другая причина - порт используется ipv6, решение:

редактировать /etc/sysctl.conf

добавить это в файл

net.ipv6.conf.all.disable_ipv6 = 1

тогда сделай это эффект

$ sudo sysctl -p /etc/sysctl.conf

или просто перезагрузите


0

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

Настройте ваше приложение на использование любого другого свободного порта, и вы увидите, что ваше приложение работает.


0

Для окон :

  1. Найти идентификатор процесса

    netstat -nao | найти "8080"

Он покажет вам идентификатор процесса в виде числа.

Пример :

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       18856

Здесь 18856 - идентификатор процесса

  1. Убить этот процесс

    Taskkill / PID 18856 / F

Вывод : SUCCESS: процесс с PID 18856 был прерван.

Здесь с помощью taskkill вы убиваете ID процесса: 18856

Для Linux / Mac :

sudo kill -9 $(sudo lsof -t -i:8080)

Здесь вы найдете процесс, использующий sudo lsof -t -i:8080и убивающий его командой sudo kill

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.