如何解决“ java.net.BindException:地址已在使用中:JVM_Bind”错误?


187

在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
当您运行代码试验时,我经常在开发机器上看到这种情况-如何避免该问题?

Answers:


141

是的,您将另一个进程绑定到同一端口。

每当我遇到JVM_BIND错误时,Windows Sysinternals的TCPView(仅Windows)便是我最喜欢的应用程序。它显示了哪些进程正在侦听哪个端口。它还提供了一个方便的上下文菜单,可以杀死进程或关闭妨碍连接的连接。


快速解决方法:打开服务器视图>双击服务器>更改所使用的端口号(例如,对于Tomcat admin,HTTP / 1.1和AJP / 1.3)
Adrien Be

2
@novice_developer netstat是您要查找的命令,带有-a和-p选项,man netstat是您其余所有命令的朋友:)
用Monica sox踢球

1
如果上述过程不起作用,请重新启动PC,我认为它将起作用。就我而言,它开始起作用。
库玛

195

如果您知道进程正在运行哪个端口,则可以输入: lsof -i:<port>

例如,lsof -i:8080列出运行在端口8080上的进程(pid)。

然后用 kill <pid>


4
是的,那是Linux。然后尝试在Windows中进行等效操作。也许这会有所帮助:stackoverflow.com/questions/15708/lsof-equivalent-for-windows
Diego Pino 2012年

1
所以我正在使用Raspbian,它说:bash:lsof:命令未找到。有什么建议?
蒙娜·贾拉勒

1
@MonaJalal hmmm不确定,但是,也许尝试类似的东西sudo apt-get install lsof
Coffee

@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

113

在Windows中

netstat -ano

将列出所有监听的协议,端口和进程。用

taskkill -pid "proces to kill" /f

杀死监听端口的进程。例如

 taskkill -pid 431 /f

10
netstat -ano | 查找“您的端口号”在Windows上用于特定端口。
BlondCode

对我而言(使用Windows 10)find不起作用,但findstr确实起作用。为了避免误报,它也有助于在冒号前加一个冒号netstat -ano | findstr :8080。完成此操作-假设它返回的PID为1234-如果您要查找此过程的名称,则可以通过tasklist /fi "pid eq 1234“。”
Steve Chambers

34

在Mac中:

杀死进程 终端:kill <pid>

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

来自迭戈·皮诺的回答


11
kill <pid>在Mac上不起作用,kill -9 <PID>与我一起工作
Samy Omar

33

Ubuntu / Unix中,我们可以通过以下两个步骤解决此问题。

  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命令杀死该进程。

    kill -9 9488

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

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


我正在数字海洋中配置CentOs服务器。如果我终止了此过程,该如何再次运行服务器?
阿维耶特·巴鲁阿(Avijit Barua)

如果它是您自己的程序,并且没有丢失任何数据,请仅使用-9。-15会告诉程序退出自身,这会彻底杀死进程。
xuiqzy

27

(仅Windows)

要终止进程,您首先需要找到进程ID(pid)

通过运行命令:

netstat -ano | findstr :yourPortNumber

如下图所示

您将获得您的进程ID(PID),现在要杀死同一进程,请运行以下命令:

taskkill /pid yourid /f

在此处输入图片说明


7

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

您可以尝试杀死在任务管理器中运行的java.exe服务之一-ps确保您不要杀死Eclipse,因为它也被列为java.exe。如果没有其他效果,则重启计算机将可以对其进行修复。看来您没有关闭先前测试的插座。希望这可以帮助。


6

对于那些正在寻找最简单答案的人(这是我们通常会错过的答案),只需停止正在运行的项目并重新启动它。在大多数情况下,我们所做的就是忘记停止先前运行的项目,而当我们重新运行该项目时,它会显示出此类问题。

我还要附上一张照片,使其更清晰(我使用“ Spring工具套件”)。因此,您需要做的是或者单击最右边的按钮(如果要重新启动同一项目),或者先单击位于右边第二个的按钮来停止项目,然后单击最左边的按钮来运行您的项目。我希望这将解决一些较新的程序员的问题。:)

在此处输入图片说明


4

在Windows CMD行中,通过输入以下命令找出在绑定端口上保持连接的进程ID:

C:> netstat -a -o

-a显示所有连接

-o显示进程标识符

然后终止该过程。


2

是的,正如Guido Simone所说的,因为另一个进程正在侦听相同的端口。如果您在Ubuntu中,只需给出命令即可终止该进程 sudo kill $(sudo lsof -t -i:[port number])

例如: sudo kill $(sudo lsof -t -i:8080)

但是一旦它对我不起作用。我下达了命令

$ lsof -i:[port] 

它什么也没显示。

我使用命令检查了我的 docker ps -adocker容器,但没有一个存活。所有容器都已停止(但我记得,我在几分钟前停止了一个使用同一端口的容器)。 docker进程使用命令,sudo service docker stop然后重试。令人惊讶的是,eclipse当时没有显示错误。它完美地运行了我的程序。

希望我的经验对您有所帮助。



1

该端口已被其他进程使用,因为@Diego Pino表示您可以在unix上使用lsof来定位该进程并杀死相应的端口,如果在Windows上,请使用netstat -ano获取该进程的所有pid,每个人都获得的端口。搜索您想要的端口并杀死。

要很容易,只要可能就重启机器:)


1

重启电脑一次,我认为它可以工作。就我而言,它开始起作用。可以完成另一件事,进入任务管理器并结束该过程。

屏幕截图以供参考。


请不要发表评论/问题。如果您删除了它,那将是更好的选择。
Clijsters

1

以我为例,Tomcat在后台运行。使用Eclipse时,我已将其安装为外部servlet。使用Intellij中的Spring Boot,它拥有自己的服务器,但是在已被占用时无法启动。
在我的情况下,Tomcat自动启动,我打开了操作系统,这就是为什么我需要手动关闭他的原因:

$ sudo service tomcat stop

当然,“ tomcat”取决于您使用的是哪个版本的tomcat。
希望对别人有帮助。


0

当我先启动Server程序然后启动Client程序时打开两个控制台时,我在Eclipse中遇到了类似的问题。我曾经在单个控制台中停止过该程序,以为它已关闭了服务器,但只关闭了客户端,而不关闭了服务器。我在任务管理器中发现正在运行Java进程。通过从服务器和客户端程序的各自的控制台关闭它们解决了此问题(Eclipse显示了最新活动程序的控制台)。因此,当我再次启动Server程序时,该端口再次打开以进行捕获。


0

您的端口在其他进程中一定很忙。因此,您可以在https://technet.microsoft.com/zh-cn/sysinternals/bb897437上下载TCPView。并使用过的端口的进程。

如果您不知道端口,请双击未启动的服务器,然后单击“打开服务器属性”页,然后单击左栏中的glassfish。您将在此处找到端口。


0

(1)检查端口是否在使用中,终止该进程

$ lsof -i:[端口]

(2)另一个原因是该端口被ipv6使用,解决方法:

编辑/etc/sysctl.conf

将此添加到文件

net.ipv6.conf.all.disable_ipv6 = 1

然后使其生效

$ sudo sysctl -p /etc/sysctl.conf

或只是重新启动


0

这意味着其他进程已在使用该端口。如果其他某些关键应用程序正在使用此端口,而您又不想关闭该应用程序,则更好的方法是选择其他任何可用的端口。

配置您的应用程序以使用其他任何免费的端口,您将看到您的应用程序正常工作。


0

对于Windows

  1. 查找进程ID

    netstat -nao | 找到“ 8080”

它将以数字形式显示进程ID。

范例

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       18856

这里的18856是进程ID

  1. 杀死那个过程

    taskkill / PID 18856 / F

输出:成功:PID 18856的过程已终止。

在这里,您可以使用taskkill杀死进程ID:18856

对于linux / mac

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

在这里,您可以找到使用sudo lsof -t -i:8080并通过sudo kill命令杀死它的进程

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.