“Java.net.BindException: Kullanılan adres: JVM_Bind” hatasını nasıl çözebilirim?


187

Eclipse'de şu hatayı aldım:

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

Neden şimdi geldiğinden emin değilim, ama sadece birkaç saat önce iyi geçti. Makinemi yeniden başlatmam gerekir mi? Nasıl dibe varabilirim? Herhangi bir ipucu veya tavsiye için teşekkür ederiz.


1
Kod denemeleri yaparken bunu geliştirme makinelerinde sık sık gördüm - Sorun nasıl önlenebilir?
will

Yanıtlar:


141

Evet, aynı bağlantı noktasına bağlı başka bir işleminiz var.

Windows Sysinternals'dan TCPView (yalnızca Windows), bir JVM_BIND hatası aldığımda favori uygulamam. Hangi işlemlerin hangi bağlantı noktasını dinlediğini gösterir. Ayrıca, işlemi sonlandırmak veya yoldaki bağlantıyı kapatmak için uygun bir bağlam menüsü sağlar.


hızlı bir çözüm: Sunucu görünümünü açın> sunucuya çift tıklayın> kullanılan bağlantı noktası numaralarını değiştirin (örn. Tomcat admin, HTTP / 1.1 ve AJP / 1.3 için)
Adrien Be

2
@novice_developer netstat, -a ve -p seçenekleriyle aradığınız komut man netstat, geri kalan her şey için arkadaşınız :)
Monica ile sox

1
Yukarıdaki işlem çalışmıyorsa, bilgisayarı bir kez yeniden başlatın, bence işe yarayacak. Benim durumumda çalışmaya başladı.
Kumar

195

İşlemin hangi portu çalıştırdığını biliyorsanız şunları yazabilirsiniz: lsof -i:<port> .

Örneğin, lsof -i:80808080 numaralı bağlantı noktasında çalışan işlemi (pid) listelemek için.

Sonra süreci öldür kill <pid>


4
Evet, bu linux. Sonra Windows'ta eşdeğer bir şey deneyin. Belki bu yardımcı olabilir: stackoverflow.com/questions/15708/lsof-equivalent-for-windows
Diego Pino

1
bu yüzden Raspbian kullanıyorum ve diyor ki: bash: lsof: komut bulunamadı. baska öneri?
Mona Jalal

1
@MonaJalal hmmm emin değilim, ama belki böyle bir şey deneyinsudo apt-get install lsof
Kahve

@DiegoPino Ben java.net.BindException: Address already in use (Bind failed) kullandım lsof -i:8080ve var aynı hatayla karşılaşıyorum tcp6 0 0 :::8080 :::* LISTEN 106872/java. Ne yapmalıyım ? Java'yı öldür?
Avijit Barua

@AvijitBarua Bu bağlantı noktasına bağlı java programının işlem kimliği (pid) 106872'dir. Başlattığınız her Java programı kendisini java programı olarak sunar (derlenmiş kodunuzu çalıştıran java sanal makinesidir). Yani evet, kritik bir (sistem) araç değil, kendi programınız ise bu java programından çıkıp öldürebilirsiniz; gibi bir görev yöneticisine bir göz atın htop. Belki de öldürülmemesi gereken geçerli bir program tarafından kullanılan bir limana bağlanmaya çalışıyorsunuzdur.
xuiqzy

114

Pencerelerde

netstat -ano

dinleyen tüm protokolleri, portları ve işlemleri listeleyecektir. kullanım

taskkill -pid "proces to kill" /f

liman dinleme sürecini öldürmek. Örneğin

 taskkill -pid 431 /f

10
netstat -ano | "bağlantı noktanızın numarasını" bulun Belirli bir bağlantı noktası için Windows'ta bunu kullanın.
BlondCode

Benim için (Windows 10 kullanarak) findişe yaramadı ama işe findstryaradı. Yanlış pozitiflerden kaçınmak için bir kolonun başlangıcına da yardımcı olur netstat -ano | findstr :8080. Bunu yaptıktan sonra - diyelim ki 1234'lük bir PID geri döndü - o zaman bu sürecin adını aramak istiyorsanız bunu yapabilirsiniz tasklist /fi "pid eq 1234".
Steve Chambers

34

Mac'te:

Öldürme işlemi Terminal:kill <pid>

Pid'i bul: Terminal:lsof -i:<port>

Diego Pino yanıtından


11
kill <pid> mac üzerinde çalışmadı, kill -9 <PID> benimle çalıştı
Samy Omar

33

In Ubuntu / Unix , aşağıda açıklandığı gibi biz 2 adımda bu sorunu çözebilir.

  1. tip netstat -plten |grep java

    Bu aşağıdakine benzer bir çıktı verecektir:

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

    İşte 8080java süreci dinleme ve edildiği port numarasıdır 9488onun süreç kimliği (pid) 'dir.

  2. İşgal altındaki limanı boşaltmak için bu işlemi killkomutla öldürmeliyiz .

    kill -9 9488

    9488daha önceki süreç kimliği. Biz kullanmak -9işlemini durdurmak zorlamak için.

Bağlantı noktanız artık boş olmalı ve sunucuyu yeniden başlatabilirsiniz.


CentOs sunucusunu dijital okyanusta yapılandırıyorum. Bu işlemi öldürürsem sunucuyu nasıl tekrar çalıştırabilirim?
Avijit Barua

-9'u yalnızca kendi programınız varsa ve orada kaybedecek verileriniz yoksa kullanın. Süreci temiz bir şekilde öldürür, -15 programa kendi kendine çıkmasını söyler.
xuiqzy

27

(Yalnızca Windows)

Bir işlemi öldürmek için önce İşlem Kimliğini (pid) bulmanız gerekir

Komutu çalıştırarak:

netstat -ano | findstr :yourPortNumber

Aşağıdaki resimde gösterildiği gibi

İşlem Kimliğinizi (PID) alacaksınız, Şimdi aynı işlemi öldürmek için şu komutu çalıştırın:

taskkill /pid yourid /f

resim açıklamasını buraya girin


7

Aynı bağlantı noktasında çalışan başka bir işleminiz var.

Görev yöneticinizde çalışan java.exe hizmetlerinden birini öldürmeyi deneyebilirsiniz - ps, java.exe olarak da listelendiği için tutulmayı öldürmediğinizden emin olun. Başka bir şey işe yaramazsa, makinenizi yeniden başlatmak yine de düzeltir. Önceki bir testten bir soketi kapatmıyorsunuz gibi görünüyor. Bu yardımcı olur umarım.


6

En basit cevapları arayanlar için (genellikle kaçırdığımız şey budur), sadece projenizi durdurup tekrar başlatın. Çoğu zaman daha önce yürüttüğümüz projeyi durdurmayı unuturuz ve projeyi yeniden çalıştırdığımızda böyle bir sorun gösterir.

Daha net hale getirmek için bir fotoğraf da ekliyorum ('Spring tool suite' kullanıyorum). Yapmanız gereken şey, aynı projeyi yeniden başlatmak istiyorsanız, ya sağdaki düğmeyi tıklamak ya da projenizi durdurmak için sağdan 2. olan düğmeye ve ardından çalıştırmak için aşırı soldaki düğmeye tıklamaktır. senin projen. Umarım bu, yeni programcıların birkaçının sorununu çözer. :)

resim açıklamasını buraya girin


4

Windows CMD satırında, aşağıdaki komutu girerek bağlanma bağlantı noktasında bağlantı bulunan İşlem Kimliğini bulun:

C:> netstat -a -o

-a tüm bağlantıları göster

-o işlem tanımlayıcısını göster

Ve sonra işlemi sonlandırın .


2

Evet, Guido Simone'un dediği gibi, aynı bağlantı noktasını dinleyen başka bir işlem. sudo kill $(sudo lsof -t -i:[port number])

örn: sudo kill $(sudo lsof -t -i:8080)

Ama bir zamanlar benim için işe yaramadı. emri verdim

$ lsof -i:[port] 

ve hiçbir şey göstermiyor.

Komut kullanarak benim liman konteynırları kontrol ettim docker ps -aama hepsi canlı değil.Tüm konteynerler durdu (ama hatırlıyorum, birkaç dakika önce aynı port kullanılan bir konteyneri durdurdum.). Docker'ın neden olmadığından emin olmak için, bütün docker komutunu kullanarak işlemi sudo service docker stoptekrar deneyin. Tutulma şu anda hatayı göstermedi.Programımı mükemmel bir şekilde çalıştırıyor.

Umarım deneyimim bir tanesine yardımcı olur.



1

@Diego Pino, işlemi bulmak ve ilgili olanı öldürmek için unix'te lsof'u kullanabileceğini söylediğinden, bağlantı noktası zaten başka bir işlem tarafından kullanılıyor. herkesin kazandığı limanlar. İstediğiniz limanı arayın ve öldürün.

çok kolay olmak için sadece makinenizi yeniden başlatın, eğer mümkünse :)


1

PC'yi bir kez yeniden başlatın, bence işe yarayacak. Benim durumumda çalışmaya başladı. Bir şey daha yapılabilir Görev Yöneticisi'ne gidin ve işlemi sonlandırın.

Referans için ekran görüntüsü.


Lütfen bir yorum / soru ile cevap vermeyin. Bunu silmeniz tercih edilir.
Clijsters

1

Benim durumumda Tomcat bir arka planda koşuyordu. Eclipse kullanırken harici bir sunucu uygulaması olarak kurdum. Intellij'de bir Spring Boot ile kendi sunucusu var, ancak zaten meşgulken başlayamıyor.
Benim durumumda Tomcat otomatik olarak başlıyor işletim sistemimi açıyorum, bu yüzden onu manuel olarak kapatmam gerekiyor:

$ sudo service tomcat stop

Tabii ki "tomcat" hangi tomcat sürümünü kullandığınıza bağlıdır.
Umarım birine yardımcı olabilir.


0

Eclipse'de, önce Server programını sonra da Client programını başlattığımda iki konsol açıldığında benzer bir sorunla karşılaştım. Sunucuyu kapattığını düşünerek programı tek konsolda durduruyordum, ancak sunucuyu değil istemciyi kapatmıştı. Görev yöneticimde Java işlemlerini çalıştırdığımı buldum. Bu sorun, hem sunucu hem de istemci programlarını kendi konsollarından kapatarak çözülmüştür (Eclipse en son etkin programın konsolunu gösterir). Sunucu programını yeniden başlattığımda, bağlantı noktası yakalanmak üzere yeniden açıldı.


0

Bağlantı noktanız başka bir İşlemde meşgul olmalıdır. Böylece TCPView'i https://technet.microsoft.com/en-us/sysinternals/bb897437 adresinden indirebilirsiniz. ve kullanılmış port için işlemi öldürebilirsiniz.

Bağlantı noktanızı bilmiyorsanız, başlamayan sunucuya çift tıklayın ve Sunucu Özellikleri Sayfasını Aç'a tıklayın ve sol sütundan cambalığı tıklayın. Limanları burada bulacaksınız.


0

(1) bağlantı noktasının kullanımda olup olmadığını kontrol edin, bu işlemi öldürün

$ lsof -i: [bağlantı noktası]

(2) başka bir neden, bağlantı noktasının ipv6, çözüm tarafından kullanılmasıdır:

edit /etc/sysctl.conf

bunu dosyaya ekle

net.ipv6.conf.all.disable_ipv6 = 1

sonra efekti yap

$ sudo sysctl -p /etc/sysctl.conf

veya sadece yeniden başlat


0

Başka bir işlem zaten bağlantı noktasını kullanıyor demektir. Bu bağlantı noktası diğer bazı kritik uygulamalar tarafından kullanılıyorsa ve bu uygulamayı kapatmak istemiyorsanız, daha iyi bir yol, kullanımı serbest olan başka bir bağlantı noktası seçmektir.

Uygulamanızı ücretsiz olan diğer bağlantı noktalarını kullanacak şekilde yapılandırın ve uygulamanızın çalıştığını göreceksiniz.


0

Pencereler için :

  1. İşlem kimliğini bulma

    netstat -nao | "8080" bul

İşlem kimliğini bir sayı olarak gösterecektir.

Örnek :

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       18856

Burada 18856 işlem kimliği

  1. Bu işlemi öldür

    taskkill / PID 18856 / F

Çıktı : BAŞARI: PID 18856 ile işlem sonlandırıldı.

Burada taskkill'i kullanarak işlem ID'sini öldürüyorsunuz: 18856

Linux / Mac için :

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

Burada sudo lsof -t -i:8080sudo kill komutunu kullanarak ve kullanarak işlemi bulabilirsiniz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.