Bagaimana cara mengatasi kesalahan "java.net.BindException: Alamat sudah digunakan: JVM_Bind"?

187

Di Eclipse, saya mendapatkan kesalahan ini:

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

Saya tidak yakin mengapa itu muncul sekarang, tetapi itu berjalan dengan baik hanya beberapa jam yang lalu. Apakah saya perlu me-restart mesin saya? Bagaimana saya bisa sampai ke dasarnya? Saya menghargai semua tips atau saran.

kopi
sumber
1
Saya sering melihat ini di mesin pengembangan ketika Anda menjalankan uji coba kode - Bagaimana masalah dapat dihindari?
Akan

Jawaban:

141

Ya, Anda memiliki proses lain yang terikat pada port yang sama.

TCPView (hanya Windows) dari Windows Sysinternals adalah aplikasi favorit saya setiap kali saya memiliki kesalahan JVM_BIND. Ini menunjukkan proses mana yang mendengarkan port mana. Ini juga menyediakan menu konteks yang nyaman untuk mematikan proses atau menutup koneksi yang menghalangi.

Guido Simone
sumber
penyelesaian cepat: Buka tampilan server> klik dua kali pada server> ubah nomor port yang digunakan (mis. untuk admin Tomcat, HTTP / 1.1, & AJP / 1.3)
Adrien Be
2
@novice_developer netstatadalah perintah yang Anda cari, dengan opsi -a dan -p, man netstatadalah teman Anda untuk semua yang lain :)
sox with Monica
1
Jika proses di atas tidak berhasil maka restart PC sekali, saya pikir itu akan berhasil. Itu mulai bekerja dalam kasus saya.
Kumar
195

Jika Anda tahu port apa yang sedang dijalankan, Anda dapat mengetik: lsof -i:<port> .

Misalnya,, lsof -i:8080untuk membuat daftar proses (pid) yang berjalan pada port 8080.

Kemudian bunuh proses dengan kill <pid>

Diego Pino
sumber
4
Ya, itu linux. Kemudian coba sesuatu yang setara di Windows. Mungkin ini bisa membantu: stackoverflow.com/questions/15708/lsof-equivalent-for-windows
Diego Pino
1
jadi saya menggunakan Raspbian dan dikatakan: bash: lsof: command tidak ditemukan. ada saran?
Mona Jalal
1
@OnaJalal hmmm tidak yakin tapi, mungkin coba sesuatu sepertisudo apt-get install lsof
Kopi
@DiegoPino Saya menghadapi kesalahan yang sama yang java.net.BindException: Address already in use (Bind failed) saya gunakan lsof -i:8080dan dapatkan tcp6 0 0 :::8080 :::* LISTEN 106872/java. Apa yang harus saya lakukan ? Bunuh java ??
Avijit Barua
@ AvijitBarua Id proses (pid) dari java programm terikat ke port ini adalah 106872. Setiap program Java yang Anda luncurkan menyajikan dirinya sebagai program java (itu adalah mesin virtual java yang menjalankan kode kompilasi Anda). Jadi ya, Anda bisa keluar atau mematikan program java ini, jika itu bukan alat penting (sistem), tetapi program Anda sendiri; lihat di task manager seperti htop. Mungkin Anda mencoba mengikat ke port yang digunakan oleh program yang valid yang tidak boleh dibunuh.
xuiqzy
114

Di jendela

netstat -ano

akan mendaftar semua protokol, port dan proses mendengarkan. Menggunakan

taskkill -pid "proces to kill" /f

untuk membunuh proses mendengarkan port. misalnya

 taskkill -pid 431 /f
Abhi
sumber
10
netstat -ano | find "number of your port" Gunakan ini pada Windows untuk port tertentu.
BlondCode
Bagi saya (menggunakan Windows 10) findtidak berhasil tetapi findstrtidak. Untuk menghindari kesalahan positif, juga membantu untuk menambahkan sebuah tanda titik dua, misalnya netstat -ano | findstr :8080. Setelah melakukan ini - katakan saja mengembalikan PID 1234 - jika Anda ingin mencari nama proses ini, ini dapat dilakukan melalui tasklist /fi "pid eq 1234".
Steve Chambers
34

Di Mac:

Bunuh proses Terminal:kill <pid>

Temukan pid: Terminal:lsof -i:<port>

Dari jawaban Diego Pino

Hoyin
sumber
11
kill <pid> tidak bekerja di mac, kill -9 <PID> bekerja dengan saya
Samy Omar
33

Di Ubuntu / Unix kita bisa menyelesaikan masalah ini dalam 2 langkah seperti dijelaskan di bawah ini.

  1. Tipe netstat -plten |grep java

    Ini akan menghasilkan output yang mirip dengan:

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

    Berikut 8080adalah nomor port tempat proses java mendengarkan dan 9488proses id (pid).

  2. Untuk membebaskan port yang diduduki, kita harus mematikan proses ini menggunakan killperintah.

    kill -9 9488

    9488adalah id proses dari sebelumnya. Kami gunakan -9untuk memaksa menghentikan proses.

Port Anda sekarang harus bebas dan Anda dapat me-restart server.

Bharti Rawat
sumber
Saya mengkonfigurasi server CentOs di lautan digital. Jika saya mematikan proses ini bagaimana saya bisa menjalankan server lagi?
Avijit Barua
Hanya gunakan -9 jika itu program Anda sendiri dan Anda tidak memiliki data yang hilang di sana. Itu secara najis membunuh prosesnya, -15 memberitahu programm untuk keluar dengan sendirinya.
xuiqzy
27

(Khusus Windows)

Untuk mematikan proses, Anda harus terlebih dahulu menemukan Id Proses (pid)

Dengan menjalankan perintah:

netstat -ano | findstr :yourPortNumber

Seperti yang ditunjukkan pada gambar di bawah ini

Anda akan mendapatkan Process Id (PID) Anda, Sekarang untuk mematikan proses yang sama jalankan perintah ini:

taskkill /pid yourid /f

masukkan deskripsi gambar di sini

Sufiyan Ansari
sumber
7

Anda memiliki proses lain yang berjalan di port yang sama.

Anda bisa mencoba membunuh salah satu layanan java.exe yang berjalan di task manager Anda - ps pastikan Anda tidak membunuh gerhana karena itu terdaftar sebagai java.exe juga. Jika tidak ada yang berhasil, menyalakan ulang mesin Anda akan memperbaikinya. Sepertinya Anda tidak mematikan soket dari tes sebelumnya. Semoga ini membantu.

javarebel
sumber
6

Bagi mereka yang mencari jawaban yang paling sederhana (karena itulah yang biasanya kami lewatkan), hentikan saja proyek yang sedang berjalan dan mulai lagi. Sebagian besar waktu yang kita lakukan adalah kita lupa untuk menghentikan proyek yang kita jalankan sebelumnya dan ketika kita menjalankan kembali proyek itu menunjukkan masalah seperti itu.

Saya juga melampirkan foto untuk membuatnya lebih jelas (saya menggunakan 'Spring tool suite'). Jadi yang perlu Anda lakukan adalah mengklik tombol di kanan ekstrem, jika Anda ingin meluncurkan kembali proyek yang sama atau klik pertama pada tombol yang kedua dari kanan untuk menghentikan proyek Anda dan kemudian tombol di kiri ekstrim untuk menjalankan proyek Anda. Saya harap ini akan menyelesaikan masalah beberapa programmer yang lebih baru. :)

masukkan deskripsi gambar di sini

Me_developer
sumber
4

Di Windows CMD line, cari tahu ID Proses yang menahan koneksi pada port bind dengan memasukkan perintah berikut:

C:> netstat -a -o

-Tunjukkan semua koneksi

-untuk menunjukkan pengenal proses

Dan kemudian Hentikan prosesnya.

CharlesX
sumber
2

Ya, seperti yang dikatakan Guido Simone karena proses lain mendengarkan port yang sama. Jika Anda berada di Ubuntu, Anda cukup mematikan proses itu dengan memberikan perintah. sudo kill $(sudo lsof -t -i:[port number])

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

Tapi begitu itu tidak berhasil untuk saya. saya memberi perintah

$ lsof -i:[port] 

dan itu tidak menunjukkan apa-apa.

Saya memeriksa kontainer buruh pelabuhan saya dengan menggunakan perintah docker ps -atetapi bukan dari mereka yang hidup. Semua kontainer telah berhenti (tapi saya ingat, saya menghentikan satu kontainer yang menggunakan port yang sama beberapa menit yang lalu.). Untuk memastikan bahwa buruh pelabuhan bukan alasannya, saya berhenti secara keseluruhan proses buruh pelabuhan menggunakan perintahsudo service docker stop dan coba lagi. Gerhana mengejutkan tidak menunjukkan kesalahan pada waktu itu. Ini menjalankan program saya dengan sempurna.

Semoga pengalaman saya akan membantu seseorang.

Yasitha Bandara
sumber
2

Anda perlu menutup port Anda jika Anda adalah pengguna linux lalu ketik

fuser -k 8080/tcp
Machhindra Neupane
sumber
1

Port sudah digunakan oleh beberapa proses lain seperti @Diego Pino mengatakan Anda dapat menggunakan lsof di unix untuk menemukan proses dan membunuh masing-masing, jika Anda berada di windows gunakan netstat -ano untuk mendapatkan semua proses dan proses. port yang diperoleh semua orang. cari port yang Anda maksud dan bunuh.

menjadi sangat mudah hanya restart mesin Anda, jika itu mungkin :)

Akash Yadav
sumber
1

Nyalakan kembali PC sekali, saya pikir itu akan berhasil. Itu mulai bekerja dalam kasus saya. Satu hal lagi yang bisa dilakukan pergi ke Task Manager dan Akhiri proses.

Tangkapan layar untuk referensi.

Kumar
sumber
Tolong jangan jawab dengan komentar / pertanyaan. Akan lebih baik jika Anda menghapus ini.
Clijsters
1

Dalam kasus saya, Tomcat berjalan di latar belakang. Saya telah menginstalnya sebagai servlet eksternal saat menggunakan Eclipse. Dengan Boot Spring di Intellij ia memiliki server sendiri tetapi tidak dapat memulai saat sudah ditempati.
Dalam kasus saya, Tomcat mulai secara otomatis saya menyalakan OS saya, itu sebabnya saya harus mematikannya secara manual:

$ sudo service tomcat stop

tentu saja "kucing jantan" tergantung pada versi kucing jantan yang Anda gunakan.
Semoga ini bisa membantu seseorang.

EnGoPy
sumber
0

Saya menghadapi masalah serupa di Eclipse ketika dua konsol dibuka ketika saya memulai program Server pertama dan kemudian program Klien. Saya biasa menghentikan program di konsol tunggal berpikir bahwa itu telah menutup server, tetapi hanya menutup klien dan bukan server. Saya menemukan menjalankan proses Java di Task manager saya. Masalah ini diselesaikan dengan menutup kedua program Server dan Klien dari masing-masing konsol (Eclipse menunjukkan konsol dari program aktif terbaru). Jadi ketika saya memulai program Server lagi, port itu kembali terbuka untuk ditangkap.

Chetan Gowda
sumber
0

Port Anda harus sibuk dalam beberapa Proses Lainnya. Jadi Anda dapat mengunduh TCPView di https://technet.microsoft.com/en-us/sysinternals/bb897437 dan mematikan proses untuk port yang digunakan.

Jika Anda tidak tahu port Anda, klik dua kali pada server yang tidak memulai dan klik pada Open Server Properties Page dan klik pada glassfish dari kolom kiri. Anda akan menemukan porta di sini.

suketup
sumber
0

(1) periksa port sedang digunakan atau tidak, matikan proses itu

$ lsof -i: [port]

(2) alasan lain adalah port digunakan oleh ipv6, solusi:

edit /etc/sysctl.conf

tambahkan ini ke file

net.ipv6.conf.all.disable_ipv6 = 1

kemudian buat efeknya

$ sudo sysctl -p /etc/sysctl.conf

atau hanya reboot

tonysok
sumber
0

Ini berarti beberapa proses lain sudah menggunakan port. Jika port ini sedang digunakan oleh beberapa aplikasi penting lainnya dan Anda tidak ingin menutup aplikasi itu, cara yang lebih baik adalah memilih port lain yang bebas untuk digunakan.

Konfigurasikan aplikasi Anda untuk menggunakan port lain yang gratis dan Anda akan melihat aplikasi Anda berfungsi.

Rakesh Burbure
sumber
0

Untuk windows :

  1. Temukan id proses

    netstat -nao | temukan "8080"

Ini akan menunjukkan kepada Anda ID proses sebagai nomor.

Contoh :

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       18856

Di sini 18856 adalah ID proses

  1. Bunuh proses itu

    taskkill / PID 18856 / F

Output : SUKSES: Proses dengan PID 18856 telah dihentikan.

Di sini menggunakan taskkill Anda membunuh ID proses: 18856

Untuk linux / Mac :

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

Di sini Anda menemukan proses menggunakan sudo lsof -t -i:8080dan membunuhnya dengan perintah sudo kill

Md. Sajedul Karim
sumber