如何解决“java.net.BindException: Address already in use: JVM_Bind”错误?

267

在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
我经常在开发机器上看到这种情况,当你运行代码试验时 -- 如何避免这个问题? - will
http://www.srikanthtechnologies.com/blog/java/changeglassfishport_4.1.aspx - jjoselon
22个回答

260
如果您知道进程正在运行的端口,可以输入以下命令:lsof -i:<port>。例如,lsof -i:8080,以列出在端口8080上运行的进程(pid)。然后使用kill <pid>杀死该进程。

6
好的,那是Linux。那么请尝试在Windows中找到相应的东西。也许这个链接可以帮助您:https://dev59.com/CXVD5IYBdhLWcg3wVKAb - Diego Pino
2
我正在使用Raspbian,但它显示:bash: lsof: 命令未找到。有什么建议吗? - Mona Jalal
2
@MonaJalal 嗯,不太确定,但是可以尝试一下 sudo apt-get install lsof 这样的命令。 - Caffeinated
@DiegoPino 我遇到了同样的错误 java.net.BindException: Address already in use (Bind failed)。我使用了 lsof -i:8080 命令,得到了 tcp6 0 0 :::8080 :::* LISTEN 106872/java 的结果。我该怎么办?杀掉 Java 进程吗? - Avijit Barua
@AvijitBarua 此端口绑定的 Java 程序的进程 ID(pid)为 106872。您启动的每个 Java 程序都会呈现为程序 java(它是运行编译代码的 Java 虚拟机)。因此,如果这不是某些关键(系统)工具而是您自己的程序,则可以退出或终止此 Java 程序;请在像 htop 这样的任务管理器中查看。也许您尝试绑定到已被有效程序使用的端口,该程序不应被终止。 - xuiqzy

169

是的,您有另一个进程绑定了同一端口。

TCPView(仅限Windows)来自Windows Sysinternals是我在遇到JVM_BIND错误时最喜欢使用的应用程序。它显示哪些进程正在监听哪个端口。它还提供方便的上下文菜单,以关闭干扰的进程或连接。


一个快速的解决方法:打开服务器视图>双击服务器>更改使用的端口号(例如Tomcat管理、HTTP/1.1和AJP/1.3)。 - Adriano
2
@novice_developer,你需要的命令是 netstat,使用 -a 和 -p 选项,而 man netstat 则可以帮助你了解更多的内容 :) - sox with Monica
1
如果以上过程不起作用,那么重启电脑一次,我认为它会起作用。在我的情况下,它开始工作了。 - Kumar

146

在Windows中

netstat -ano

将列出所有正在监听的协议、端口和进程。

使用:

taskkill -pid "proces to kill" /f

终止占用该端口的进程。

 taskkill -pid 431 /f

14
在Windows系统中查找特定端口的使用情况,可使用以下命令:netstat -ano | find "你的端口号"。 - BlondCode
5
对于我来说(使用Windows 10),find命令无法正常工作,但是findstr可以。为了避免误报,最好在搜索内容前加上冒号,例如:netstat -ano | findstr :8080。如果这样做后返回了PID 1234,如果您想查找此进程的名称,可以使用tasklist /fi "pid eq 1234"命令完成。 - Steve Chambers

47
在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 则是该进程的进程 ID(pid)。

  2. 为了释放被占用的端口,我们需要使用 kill 命令杀死该进程。

  3. kill -9 9488
    

    9488是之前的进程ID。我们使用-9来强制停止进程。

    现在您的端口应该是空闲的,您可以重新启动服务器。


我正在Digital Ocean上配置CentOS服务器。如果我终止了这个进程,我该如何重新运行服务器? - Avijit Barua
只有在您自己的程序中没有任何数据需要保存时,才使用“-9”。它会强制终止进程,“-15”则告诉程序退出自身。 - xuiqzy

43

在Mac中:

结束进程 终端: kill <pid>

查找pid: 终端: lsof -i:<port>

参考Diego Pino的回答


16
在Mac电脑上,使用“kill <pid>”无法杀死进程,但是使用“kill -9 <PID>”可以成功。 - Samy Omar
kill -9 是强制杀死进程。你可以尝试使用kill -15发送TERM信号。 - Aruna

36

(仅适用于Windows)

要终止一个进程,首先需要找到该进程的进程ID(pid)。

通过运行以下命令:

netstat -ano | findstr :yourPortNumber

如下图所示

您将获得您的进程ID(PID),现在运行此命令以杀死相同的进程:

taskkill /pid yourid /f

输入图像描述


1.) 使用PowerShell运行命令:netstat -ano | findstr :5000 2.) 停止进程:<从步骤1获取的PID> - user1131926

21

对于Windows系统:

  1. 查找进程ID

    netstat -nao | find "8080"

它会显示一个数字作为进程ID。

示例:

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       18856

这里18856是进程ID。

  1. 结束该进程

    taskkill /PID 18856 /F

输出:SUCCESS: 进程ID 18856 已被终止。

使用taskkill命令结束进程ID:18856。

对于Linux/Mac:

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

以下是使用 sudo lsof -t -i:8080 命令找到占用端口8080的进程,并使用 sudo kill 命令结束该进程的过程。


9
针对那些寻求最简单答案的人(因为我们通常会错过它们),只需停止正在运行的项目,然后重新开始即可。大多数时候,我们忘记停止先前运行的项目,当我们重新启动项目时,就会出现此类问题。
我还附上了一张照片,以使其更加清晰(我使用'Spring工具套件')。你需要做的是要么点击极右边的按钮(如果要重新启动同一项目),要么首先点击第二个按钮来停止你的项目,然后再点击极左边的按钮来运行你的项目。我希望这能解决新手程序员中的一些问题。 :)

enter image description here


9

您在同一端口上运行了另一个进程。

您可以尝试在任务管理器中结束其中一个正在运行的 java.exe 服务 - 请确保不要终止 Eclipse,因为它也被列为 java.exe。如果其他方法都不起作用,重启计算机将无论如何解决问题。看起来您没有关闭以前测试的套接字。希望这能帮到您。


5

在Windows CMD命令行中,输入以下命令以查找持有绑定端口连接的进程ID:

C:> netstat -a -o

-a 显示所有连接

-o 显示进程标识符

然后终止该进程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接