Jak rozwiązać błąd „java.net.BindException: Adres już używany: JVM_Bind”?


187

W Eclipse dostałem ten błąd:

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

Nie jestem pewien, dlaczego to się teraz pojawiło, ale działało dobrze kilka godzin temu. Czy muszę ponownie uruchomić komputer? Jak dojść do sedna? Doceniam wszelkie wskazówki lub porady.


1
Często widziałem to na komputerach programistycznych, gdy przeprowadzasz wersje próbne kodu - jak można uniknąć tego problemu?
będzie

Odpowiedzi:


141

Tak, masz inny proces związany z tym samym portem.

TCPView (tylko Windows) z Windows Sysinternals to moja ulubiona aplikacja, gdy tylko pojawia się błąd JVM_BIND. Pokazuje, które procesy nasłuchują na którym porcie. Zapewnia również wygodne menu kontekstowe, w którym można albo zabić proces, albo zamknąć przeszkadzające połączenie.


szybkie obejście: otwórz widok serwera> kliknij dwukrotnie serwer> zmień używane numery portów (np. dla administratora Tomcat, HTTP / 1.1 i AJP / 1.3)
Adrien Be

2
@novice_developer netstatjest poleceniem, którego szukasz, z opcjami -a i -p, man netstatjest twoim przyjacielem dla całej reszty :)
sox z Monicą

1
Jeśli powyższy proces nie działa, a następnie uruchom ponownie komputer raz, myślę, że będzie działać. Zaczęło działać w moim przypadku.
Kumar

195

Jeśli wiesz, na jakim porcie działa proces, możesz wpisać: lsof -i:<port> .

Na przykład, lsof -i:8080aby wyświetlić proces (pid) uruchomiony na porcie 8080.

Następnie zabij proces za pomocą kill <pid>


4
Tak, to jest linux. Następnie wypróbuj coś równoważnego w systemie Windows. Może to może pomóc: stackoverflow.com/questions/15708/lsof-equivalent-for-windows
Diego Pino

1
więc używam Raspbian i mówi: bash: lsof: polecenie nie znaleziono. jakieś sugestie?
Mona Jalal

1
@MonaJalal hmmm nie jestem pewien, ale może spróbuj czegoś takiegosudo apt-get install lsof
Coffee

@DiegoPino Mam ten sam błąd, java.net.BindException: Address already in use (Bind failed) którego użyłem lsof -i:8080i dostałem tcp6 0 0 :::8080 :::* LISTEN 106872/java. Co powinienem zrobić ? Kill Java?
Avijit Barua

@AvijitBarua Identyfikator procesu (pid) programu Java powiązanego z tym portem to 106872. Każdy uruchamiany program Java przedstawia się jako program Java (jest to wirtualna maszyna Java, która uruchamia skompilowany kod). Tak, możesz wyjść lub zabić ten program Java, jeśli nie jest to jakieś krytyczne narzędzie (systemowe), ale twój własny program; spójrz na menedżera zadań, takiego jak htop. Być może próbujesz połączyć się z portem używanym przez prawidłowy program, którego nie należy zabijać.
xuiqzy

113

W systemie Windows

netstat -ano

wyświetli listę wszystkich protokołów, portów i procesów nasłuchujących. Posługiwać się

taskkill -pid "proces to kill" /f

aby zabić proces nasłuchujący na porcie. na przykład

 taskkill -pid 431 /f

10
netstat -ano | znajdź „numer swojego portu” Użyj tego w systemie Windows dla określonego portu.
BlondCode,

Dla mnie (w systemie Windows 10) findnie działało, ale działało findstr. Aby uniknąć fałszywych trafień, pomaga także przygotować dwukropek, np netstat -ano | findstr :8080. Po zrobieniu tego - powiedzmy, że zwrócił PID 1234 - jeśli chcesz sprawdzić nazwę tego procesu, możesz to zrobić za pomocą tasklist /fi "pid eq 1234".
Steve Chambers

34

W systemie Mac:

Terminal procesu zabicia :kill <pid>

Znajdź pid: Terminal:lsof -i:<port>

Odpowiedź Diego Pino


11
kill <pid> nie działał na Macu, kill -9 <PID> pracował ze mną
Samy Omar

33

W Ubuntu / Unix możemy rozwiązać ten problem w 2 krokach, jak opisano poniżej.

  1. Rodzaj netstat -plten |grep java

    To da wynik podobny do:

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

    Oto 8080numer portu, pod którym nasłuchuje proces Java, i 9488jego identyfikator procesu (pid).

  2. Aby uwolnić zajęty port, musimy zabić ten proces za pomocą killpolecenia.

    kill -9 9488

    9488to identyfikator procesu wcześniejszy. Używamy, -9aby wymusić zatrzymanie procesu.

Twój port powinien być teraz wolny i możesz zrestartować serwer.


Konfiguruję serwer CentOs w cyfrowym oceanie. Jeśli zabiję ten proces, jak mogę ponownie uruchomić serwer?
Avijit Barua

Używaj -9 tylko wtedy, gdy jest to twój własny program i nie masz tam żadnych danych do stracenia. Nieczysto zabija proces, -15 mówi programowi, aby sam się opuścił.
xuiqzy

27

(Tylko Windows)

Aby zabić proces, najpierw musisz znaleźć identyfikator procesu (pid)

Uruchamiając polecenie:

netstat -ano | findstr :yourPortNumber

Jak pokazano na zdjęciu poniżej

Otrzymasz swój identyfikator procesu (PID). Teraz, aby zabić ten sam proces, uruchom polecenie:

taskkill /pid yourid /f

wprowadź opis zdjęcia tutaj


7

Masz inny proces działający na tym samym porcie.

Możesz spróbować zabić jedną z usług java.exe uruchomionych w menedżerze zadań - ps upewnij się, że nie zabijasz zaćmienia, ponieważ jest ono również wymienione jako java.exe. Jeśli nic innego nie zadziała, zrestartowanie komputera i tak go naprawi. Wygląda na to, że nie wyłączasz gniazda z poprzedniego testu. Mam nadzieję że to pomoże.


6

Dla tych, którzy szukają najprostszych odpowiedzi (bo tego zwykle brakuje), po prostu zatrzymaj swój projekt i zacznij go od nowa. W większości przypadków zapominamy zatrzymać projekt, który uruchomiliśmy wcześniej, a kiedy ponownie uruchamiamy projekt, pojawia się taki problem.

Załączam również zdjęcie, aby było bardziej przejrzyste (używam „pakietu narzędzi Spring”). Więc co musisz zrobić, to albo kliknąć przycisk po prawej stronie, jeśli chcesz ponownie uruchomić ten sam projekt, albo najpierw kliknąć przycisk, który jest drugi z prawej strony, aby zatrzymać projekt, a następnie przycisk po lewej stronie, aby uruchomić Twój projekt. Mam nadzieję, że rozwiąże to problem kilku nowszych programistów. :)

wprowadź opis zdjęcia tutaj


4

W wierszu CMD systemu Windows znajdź identyfikator procesu, który utrzymuje połączenie na porcie powiązania, wprowadzając następujące polecenie:

C:> netstat -a -o

-a pokaż wszystkie połączenia

-o pokaż identyfikator procesu

A następnie zakończ proces.


2

Tak, jak powiedział Guido Simone, ponieważ inny proces nasłuchuje na tym samym porcie. Jeśli jesteś w Ubuntu, możesz po prostu zabić ten proces, wydając polecenie sudo kill $(sudo lsof -t -i:[port number])

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

Ale kiedyś mi się nie udało. wydałem polecenie

$ lsof -i:[port] 

i nic nie pokazuje.

Sprawdziłem kontenery dokerów za pomocą polecenia, docker ps -aale żaden z nich nie żył. Wszystkie kontenery zatrzymały się (ale pamiętam, zatrzymałem jeden kontener, który był używany ten sam port kilka minut temu.). Aby upewnić się, że doker nie jest powodem, zatrzymuję cały dokuj proces za pomocą polecenia sudo service docker stopi spróbuj ponownie. Zaskakujące zaćmienie nie pokazało wtedy błędu. To uruchomiło mój program idealnie.

Mam nadzieję, że moje doświadczenie pomoże komuś.



1

Port jest już używany przez inny proces, ponieważ @Diego Pino powiedział, że możesz użyć lsof na unixie, aby zlokalizować proces i zabić odpowiedni, jeśli korzystasz z systemu Windows, użyj netstat -ano, aby uzyskać wszystkie pid procesu i porty, które wszyscy nabywają. wyszukaj zamierzony port i zabij.

bardzo łatwo zrestartuj komputer, jeśli to możliwe :)


1

Ponownie uruchom komputer, myślę, że zadziała. Zaczęło działać w moim przypadku. Jeszcze jedną rzecz można zrobić, przejdź do Menedżera zadań i zakończ proces.

Zrzut ekranu dla odniesienia.


Proszę nie odpowiadać komentarzem / pytaniem. Byłoby lepiej, gdybyś to usunął.
Clijsters

1

W moim przypadku Tomcat działał w tle. Zainstalowałem go jako zewnętrzny serwlet podczas korzystania z Eclipse. Dzięki Spring Boot w Intellij ma własny serwer, ale nie można go uruchomić, gdy jest już zajęty.
W moim przypadku Tomcat uruchamia się automatycznie Włączam system operacyjny, dlatego muszę go ręcznie wyłączyć:

$ sudo service tomcat stop

oczywiście „tomcat” zależy od używanej wersji tomcat.
Mam nadzieję, że może komuś pomóc.


0

Podobny problem wystąpił w środowisku Eclipse, gdy dwie konsole zostały otwarte, kiedy najpierw uruchomiłem program serwera, a następnie program klienta. Kiedyś zatrzymywałem program w pojedynczej konsoli, myśląc, że zamknął serwer, ale zamknął tylko klienta, a nie serwer. Znalazłem uruchomione procesy Java w moim menedżerze zadań. Ten problem został rozwiązany przez zamknięcie programów serwera i klienta z ich indywidualnych konsol (Eclipse pokazuje konsolę najnowszego aktywnego programu). Więc kiedy ponownie uruchomiłem program serwera, port był ponownie otwarty do przechwycenia.


0

Twój port musi być zajęty w innym procesie. Możesz więc pobrać TCPView na https://technet.microsoft.com/en-us/sysinternals/bb897437 i zabić proces dla używanego portu.

Jeśli nie znasz swojego portu, kliknij dwukrotnie serwer, który się nie uruchamia, kliknij opcję Otwórz stronę właściwości serwera i kliknij szklaną rybkę z lewej kolumny. Porty znajdziesz tutaj.


0

(1) sprawdź, czy port jest używany, czy nie, zabij ten proces

$ lsof -i: [port]

(2) innym powodem jest to, że port jest używany przez ipv6, rozwiązanie:

edytuj /etc/sysctl.conf

dodaj to do pliku

net.ipv6.conf.all.disable_ipv6 = 1

to zrób efekt

$ sudo sysctl -p /etc/sysctl.conf

lub po prostu uruchom ponownie


0

Oznacza to, że jakiś inny proces już korzysta z portu. Jeśli ten port jest używany przez inne krytyczne aplikacje i nie chcesz go zamykać, lepszym sposobem jest wybranie dowolnego innego portu, z którego można korzystać bezpłatnie.

Skonfiguruj aplikację tak, aby korzystała z dowolnego innego wolnego portu, a zobaczysz, że aplikacja działa.


0

W systemie Windows :

  1. Znajdź identyfikator procesu

    netstat -nao | znajdź „8080”

Wyświetli identyfikator procesu jako liczbę.

Przykład :

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       18856

Tutaj 18856 jest identyfikatorem procesu

  1. Zabij ten proces

    taskkill / PID 18856 / F

Wynik : SUKCES: Proces z PID 18856 został zakończony.

Tutaj za pomocą zadania zabijasz identyfikator procesu: 18856

W przypadku systemu Linux / Mac :

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

Tutaj znajdziesz proces używania sudo lsof -t -i:8080i zabijania go za pomocą polecenia sudo kill

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.