Làm cách nào để tôi giải quyết java java.net.BindException: Địa chỉ đã được sử dụng: JVM_Bind lỗi?


187

Trong Eclipse, tôi đã gặp lỗi này:

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

Tôi không chắc tại sao nó lại xuất hiện, nhưng nó đã chạy tốt chỉ vài giờ trước. Tôi có cần khởi động lại máy không? Làm thế nào để tôi đi đến tận cùng của nó? Tôi đánh giá cao bất kỳ lời khuyên hoặc lời khuyên.


1
Tôi đã thấy điều này thường xuyên trên các máy phát triển khi bạn đang chạy thử nghiệm mã - Làm thế nào để tránh sự cố?
sẽ

Câu trả lời:


141

Có bạn có một quá trình khác ràng buộc với cùng một cổng.

TCPView (chỉ dành cho Windows) từ Windows Sysiternals là ứng dụng yêu thích của tôi bất cứ khi nào tôi gặp lỗi JVM_BIND. Nó cho thấy các quá trình đang lắng nghe trên cổng nào. Nó cũng cung cấp một menu ngữ cảnh thuận tiện để giết quá trình hoặc đóng kết nối đang cản trở.


giải quyết nhanh: Xem máy chủ mở> nhấp đúp chuột vào máy chủ> thay đổi số cổng được sử dụng (ví dụ: đối với quản trị viên Tomcat, HTTP / 1.1, & AJP / 1.3)
Adrien Be

2
@novice_developer netstatlà lệnh bạn đang tìm kiếm, với các tùy chọn -a và -p, man netstatlà bạn của bạn cho tất cả những người còn lại :)
sox với Monica

1
Nếu quá trình trên không hoạt động thì hãy khởi động lại PC một lần, tôi nghĩ nó sẽ hoạt động. Nó bắt đầu làm việc trong trường hợp của tôi.
Kumar

195

Nếu bạn biết cổng nào đang chạy, bạn có thể gõ : lsof -i:<port>.

Ví dụ, lsof -i:8080để liệt kê quá trình (pid) đang chạy trên cổng 8080.

Sau đó giết quá trình với kill <pid>


4
Vâng, đó là linux. Sau đó thử một cái gì đó tương đương trong Windows. Có lẽ điều này có thể giúp: stackoverflow.com/questions/15708/lsof-equivalent-for-windows
Diego Pino

1
Vì vậy, tôi đang sử dụng Raspbian và nó nói: bash: lsof: lệnh không tìm thấy. bất kỳ đề xuất?
Mona Jalal

1
@MonaJalal hmmm không chắc chắn, nhưng có thể thử một cái gì đó nhưsudo apt-get install lsof
Cà phê

@DiegoPino Tôi đang đối mặt với lỗi tương tự java.net.BindException: Address already in use (Bind failed) tôi đã sử dụng lsof -i:8080và mắc phải tcp6 0 0 :::8080 :::* LISTEN 106872/java. Tôi nên làm gì ? Giết java ??
Avijit Barua

@AvijitBarua Id tiến trình (pid) của chương trình java được liên kết với cổng này là 106872. Mỗi chương trình Java mà bạn khởi chạy sẽ trình bày dưới dạng java chương trình (đó là máy ảo java chạy mã được biên dịch của bạn). Vì vậy, có, bạn có thể thoát hoặc giết chương trình java này, nếu đó không phải là một công cụ (hệ thống) quan trọng, mà là chương trình của riêng bạn; có một cái nhìn trong một công việc quản lý như htop. Có lẽ bạn cố gắng liên kết với một cổng được sử dụng bởi một chương trình hợp lệ không nên bị giết.
xuiqzy

113

Trong cửa sổ

netstat -ano

sẽ liệt kê tất cả các giao thức, cổng và quá trình lắng nghe. Sử dụng

taskkill -pid "proces to kill" /f

để giết quá trình nghe cổng. ví dụ

 taskkill -pid 431 /f

10
netstat -ano | tìm "số cổng của bạn" Sử dụng số này trên Windows cho cổng cụ thể.
BlondCode

Đối với tôi (sử dụng Windows 10) findkhông hoạt động nhưng findstrđã làm. Để tránh dương tính giả, nó cũng giúp chuẩn bị một dấu hai chấm, ví dụ netstat -ano | findstr :8080. Đã thực hiện điều này - giả sử nó đã trả về PID 1234 - nếu sau đó bạn muốn tìm kiếm tên của quy trình này thì điều này có thể được thực hiện thông qua tasklist /fi "pid eq 1234".
Steve Chambers

34

Trong máy Mac

Tiêu diệt quá trình Terminal:kill <pid>

Tìm pid: Terminal:lsof -i:<port>

Từ câu trả lời của Diego Pino


11
kill <pid> không hoạt động trên mac, kill -9 <PID> đã hoạt động với tôi
Samy Omar

33

Trong Ubuntu / Unix chúng ta có thể giải quyết vấn đề này theo 2 bước như được mô tả dưới đây.

  1. Kiểu netstat -plten |grep java

    Điều này sẽ cho một đầu ra tương tự như:

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

    Đây 8080là số cổng mà quá trình java đang nghe và 9488là id tiến trình của nó (pid).

  2. Để giải phóng cổng bị chiếm, chúng ta phải tiêu diệt quá trình này bằng killlệnh.

    kill -9 9488

    9488là id quá trình từ trước đó. Chúng tôi sử dụng -9để buộc dừng quá trình.

Cổng của bạn bây giờ sẽ miễn phí và bạn có thể khởi động lại máy chủ.


Tôi đang cấu hình máy chủ CentOs trong đại dương kỹ thuật số. Nếu tôi giết quá trình này, làm thế nào tôi có thể chạy lại máy chủ?
Avijit Barua

Chỉ sử dụng -9 nếu đó là chương trình của riêng bạn và bạn không có bất kỳ dữ liệu nào bị mất ở đó. Nó giết chết quá trình một cách không rõ ràng, -15 nói với chương trình tự thoát ra.
xuiqzy

27

(Chỉ dành cho Windows)

Để giết tiến trình, trước tiên bạn cần tìm Id tiến trình (pid)

Bằng cách chạy lệnh:

netstat -ano | findstr :yourPortNumber

Như thể hiện trong hình dưới đây

Bạn sẽ nhận được Id quy trình (PID) của mình, Bây giờ để tiêu diệt cùng một quy trình chạy lệnh này:

taskkill /pid yourid /f

nhập mô tả hình ảnh ở đây


7

Bạn có một quá trình khác chạy trên cùng một cổng.

Bạn có thể thử giết một trong các dịch vụ java.exe đang chạy trong trình quản lý tác vụ của mình - ps đảm bảo bạn không giết nhật thực vì nó cũng được liệt kê là java.exe. Nếu không có gì khác hoạt động, khởi động lại máy của bạn sẽ khắc phục nó bằng mọi cách. Có vẻ như bạn không tắt ổ cắm từ bài kiểm tra trước. Hi vọng điêu nay co ich.


6

Đối với những người đang tìm kiếm câu trả lời đơn giản nhất (vì đó là những gì chúng ta thường bỏ lỡ), chỉ cần dừng dự án đang chạy của bạn và bắt đầu lại. Hầu hết thời gian chúng tôi làm là chúng tôi quên dừng dự án chúng tôi đã chạy trước đó và khi chúng tôi chạy lại dự án, nó cho thấy một vấn đề như vậy.

Tôi cũng đang đính kèm một bức ảnh để làm cho nó rõ ràng hơn (tôi sử dụng 'Bộ công cụ mùa xuân'). Vì vậy, những gì bạn cần làm là nhấp vào nút ở cực bên phải, nếu bạn muốn khởi chạy lại cùng một dự án hoặc nhấp vào nút thứ 2 từ bên phải để dừng dự án của bạn và sau đó nút ở cực bên trái để chạy dự án của bạn. Tôi hy vọng điều này sẽ giải quyết vấn đề của một vài lập trình viên mới hơn. :)

nhập mô tả hình ảnh ở đây


4

Trong dòng Windows CMD, tìm ra ID tiến trình giữ kết nối trên cổng liên kết bằng cách nhập lệnh sau:

C:> netstat -a -o

-a hiển thị tất cả các kết nối

-o hiển thị định danh quy trình

Và sau đó chấm dứt quá trình.


2

Đúng, như Guido Simone đã nói vì một quá trình khác nghe cùng một cổng. Nếu bạn đang ở trong Ubuntu, bạn có thể chỉ cần giết lệnh đó để đưa ra lệnh sudo kill $(sudo lsof -t -i:[port number])

Ví dụ: sudo kill $(sudo lsof -t -i:8080)

Nhưng một khi nó không làm việc cho tôi. tôi đã ra lệnh

$ lsof -i:[port] 

và nó không cho thấy gì.

Tôi đã kiểm tra các container docker ps -adocker của mình bằng lệnh nhưng không phải trong số chúng còn sống. Tất cả các container đã dừng (nhưng tôi nhớ, tôi đã dừng một container được sử dụng cùng một cổng cách đây vài phút.) Để chắc chắn rằng docker không phải là lý do, tôi đã dừng toàn bộ quá trình docker sử dụng lệnhsudo service docker stop và thử lại. Thật đáng ngạc nhiên khi nhật thực không hiển thị lỗi tại thời điểm đó. Nó chạy chương trình của tôi một cách hoàn hảo.

Hy vọng kinh nghiệm của tôi sẽ giúp một số.



1

Cổng này đã được sử dụng bởi một số quy trình khác vì @Diego Pino cho biết bạn có thể sử dụng lsof trên unix để xác định quy trình và tiêu diệt quy trình tương ứng, nếu bạn đang ở trên cửa sổ, hãy sử dụng netstat -ano để lấy tất cả các giá trị của quy trình và cổng mà mọi người có được. tìm kiếm cổng dự định của bạn và giết.

rất dễ dàng chỉ cần khởi động lại máy của bạn, nếu điều đó có thể :)


1

Khởi động lại PC một lần, tôi nghĩ nó sẽ hoạt động. Nó bắt đầu làm việc trong trường hợp của tôi. Một điều nữa có thể được thực hiện đi đến Trình quản lý tác vụ và Kết thúc quá trình.

Ảnh chụp màn hình để tham khảo.


Xin vui lòng không trả lời với một bình luận / câu hỏi. Nó sẽ là tốt hơn nếu bạn xóa điều này.
Clijsters

1

Trong trường hợp của tôi Tomcat đã chạy trong một nền. Tôi đã cài đặt nó như một servlet bên ngoài trong khi sử dụng Eclipse. Với Spring Boot trong Intellij, nó có máy chủ riêng nhưng không thể khởi động trong khi nó đã bị chiếm đóng.
Trong trường hợp của tôi, Tomcat tự động khởi động Tôi bật hệ điều hành của mình, đó là lý do tại sao tôi cần phải tắt thủ công:

$ sudo service tomcat stop

tất nhiên "tomcat" phụ thuộc vào phiên bản tomcat bạn đang sử dụng.
Hy vọng nó có thể giúp cho một ai đó.


0

Tôi đã gặp vấn đề tương tự trong Eclipse khi hai bàn giao tiếp được mở khi tôi khởi động chương trình Máy chủ trước và sau đó là chương trình Máy khách. Tôi đã từng dừng chương trình trong bảng điều khiển duy nhất với suy nghĩ rằng nó đã đóng máy chủ, nhưng nó chỉ đóng máy khách chứ không đóng máy chủ. Tôi tìm thấy chạy các quy trình Java trong Trình quản lý tác vụ của mình. Vấn đề này đã được giải quyết bằng cách đóng cả hai chương trình Máy chủ và Máy khách từ bảng điều khiển riêng của chúng (Eclipse hiển thị bảng điều khiển của chương trình hoạt động mới nhất). Vì vậy, khi tôi khởi động lại chương trình Máy chủ, cổng lại được mở để được ghi lại.


0

Cổng của bạn phải bận trong một số quy trình khác. Vì vậy, bạn có thể tải xuống TCPView trên https://technet.microsoft.com/en-us/sysiternals/bb897437 và hủy quá trình cho cổng đã sử dụng.

Nếu bạn không biết cổng của mình, nhấp đúp vào máy chủ không bắt đầu và nhấp vào Trang thuộc tính máy chủ mở và nhấp vào cá thủy tinh từ cột bên trái. Bạn sẽ tìm thấy các cổng ở đây.


0

(1) kiểm tra cổng có được sử dụng hay không, hủy quá trình đó

$ lsof -i: [cổng]

(2) một lý do khác là cổng được sử dụng bởi ipv6, giải pháp:

chỉnh sửa /etc/sysctl.conf

thêm phần này vào tập tin

net.ipv6.conf.all.disable_ipv6 = 1

sau đó làm cho nó có hiệu lực

$ sudo sysctl -p /etc/sysctl.conf

hoặc chỉ khởi động lại


0

Nó có nghĩa là một số quá trình khác đã sử dụng cổng. Trong trường hợp nếu cổng này đang được sử dụng bởi một số ứng dụng quan trọng khác và bạn không muốn đóng ứng dụng đó, cách tốt hơn là chọn bất kỳ cổng nào khác miễn phí sử dụng.

Định cấu hình ứng dụng của bạn để sử dụng bất kỳ cổng nào khác miễn phí và bạn sẽ thấy ứng dụng của mình hoạt động.


0

Đối với cửa sổ :

  1. Tìm id quá trình

    netstat -nao | tìm "8080"

Nó sẽ hiển thị cho bạn ID tiến trình dưới dạng số.

Ví dụ :

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       18856

Ở đây 18856 là ID tiến trình

  1. Giết quá trình đó

    nhiệm vụ / PID 18856 / F

Đầu ra : THÀNH CÔNG: Quá trình với PID 18856 đã bị chấm dứt.

Ở đây bằng cách sử dụng taskkill, bạn đang giết tiến trình ID: 18856

Đối với linux / Mac :

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

Ở đây bạn tìm thấy quá trình sử dụng sudo lsof -t -i:8080và giết nó bằng lệnh sudo kill

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.