地址已被占用:JVM_Bind Java

62

有时候当我重启以下应用程序(基于Java、Struts、Mysql和Jboss 4.05版本),会出现错误:Address already in use: JVM_Bind

我所知道的唯一修复方法是重新启动机器并再次尝试,它就可以工作了。 否则,有时我按Ctrl-Alt-Del并停止所有与Java相关的进程,这也有时有效。

但是确切的原因是什么,我们该如何防止这个问题发生?


有时候端口所有权会在你关闭Java程序后仍然停留和绑定。但是,使用Eclipse Java EE,端口绑定会在你退出程序的那一刻被移除。 - CodyBugstein
17个回答

51

地址已在使用中: JVM_Bind

表示另一个应用程序已经在监听您当前应用程序尝试绑定的端口。

您需要做的是,要么为您当前的应用程序更改端口,或者更好的方法是找到已经运行的应用程序并将其关闭。

在Linux上,您可以使用以下命令找到应用程序的进程ID:

netstat -tulpn

5
在Windows操作系统中,你要如何找到它?我正在Windows上运行我的应用程序。 - gmhk
10
netstat 在 Windows 上也可以使用,在控制台上尝试输入:netstat -an 更多信息,请参考:http://en.wikipedia.org/wiki/Netstat - phoenix24
1
另一个建议是不要在 Windows 上运行应用程序服务器。否则,不要点击重启按钮——而是停止,等待 5 秒钟,然后手动重新启动。有时候,Java 进程只需要一点时间来关闭。例如,如果它们正在忙于数据库操作,它们往往会一直挂起,直到该操作完成。 - rompetroll
这个回答很好(+1);然而,http://javarevisited.blogspot.com/2011/12/address-already-use-jvm-bind-exception.html在特别是关于Windows方面提供了更详细的信息。如果您将其中一些信息纳入考虑,这个回答会更好。 - kc2001
tulpn未被识别。 - Berit Larsen
我想补充一下,有一次我遇到了这种情况,即被认为存在冲突的端口实际上并未被任何其他正在运行的应用程序使用。我重新启动了计算机(Windows),然后应用程序就可以正常启动了。当时有一些Windows更新“等待重新启动”。也许是因为某些意外状态导致的。如果其他人也遇到了同样的情况,我想分享一下我的经验。 - charlie arehart

29
在Windows操作系统中,如果Eclipse没有正确关闭就崩溃了,那么本地的Jetty或Tomcat服务器会继续运行。当您重新打开Eclipse并尝试再次启动服务器时,将会导致“Address already in use: JVM_Bind”的错误。
要解决此问题,请打开任务管理器并找到javaw.exe进程并结束它。然后可以在Eclipse上重新启动服务器。
示例图片如下:

输入图像描述


太棒了!对我有用。 - Harsh Phoujdar

22

在 Windows 上,在提升权限的 cmd/ps 中

net stop winnat

那么

net start winnat

重置Windows的NAT服务,从而移除故障侦听器。此方法适用于大多数“无法在此端口上侦听”的错误,例如Docker、JVM等。


这对我有帮助。我在Windows机器上启动一个应用程序时,JVM一直报告地址已被使用的错误,尽管没有任何东西在使用该端口。重新启动winnat服务解决了这个问题。 - undefined

13

通常当我使用JBoss服务器时,会遇到端口已被占用的情况。

常见罪犯:

  1. Apache Http Server => 如果在Windows上工作,请关闭该服务。
  2. IIS => 使用停止ISS。
  3. Skype => 是的,我发现Skype会附着在80端口上。

要更改JBoss 4.2.x绑定自身的端口,请转到:

"C:\jboss4.2.2\server\default\deploy\jboss-web.deployer\server.xml"

这里"default"是服务器实例,更改此处的端口:

<Connector port="8080" address="${jboss.bind.address}" >

在上面的示例中,端口绑定为8080。


1
关闭Skype并运行您的Java应用程序,然后再打开Skype。 - signonsridhar

7

打开命令行并输入:netstat -a -o -ntasklist 以查看当前正在运行的进程。 找到与Java相关的端口并输入:taskkill /F /PID <您的PID号码>。 点击Enter键。


3

MySql和JBoss可能会监听同一个端口吗?

错误信息中是否有指定端口号,例如Address already in use: JVM_Bind:8080

您可以更改JBoss server.xml中的端口以进行测试。


2
为了完整性,因为很多人可能因为其他原因而进入这个SO,以下是另一个帮助我的信息:

TL;DR;
检查您想打开的端口是否被保留(即使没有应用程序打开它)
在Windows上:
netsh interface ipv4 show excludedportrange protocol=tcp

解释:
至少在Windows上,“java.net.BindException: Address already in use: JVM_Bind”的另一个可能原因是操作系统“保留”了该端口。
如果您使用此主题中其他答案中的命令,则会告诉您没有应用程序正在侦听该端口,但是您无法打开它。

一些Windows更新像这样的保留了一段范围的端口,因此无法再由进程声明。
尽管未明确说明无法打开的端口,但更新说明提到了可以帮助排除问题的命令:

netsh interface ipv4 show excludedportrange protocol=tcp

这将产生一个被阻止的端口范围列表:

Protocol tcp Port Exclusion Ranges

Start Port    End Port
----------    --------
5357        5357
49709       49808
49809       49908
49909       50008
50009       50108
50109       50208
50280       50379

* - Administered port exclusions.

1

这也可能是由于在..\tomcat\conf\server.xml中端口8080的双重定义引起的:

<Connector port="8080"
           enableLookups="false" redirectPort="8443" debug="0"/>
<Connector port="8080"
           enableLookups="false" address="127.0.0.1" maxParameterCount="30000"/>

1
如何预防这种情况的快速答案是,您很可能需要在重新启动之前停止 JBoss。
您应该可以调用“终止”按钮以关闭服务器。

我正在Eclipse中启动JBoss。 - gmhk

1

这个错误意味着你正在尝试在另一个ServerSocket已经使用的端口上创建一个新的ServerSocket。因此,请尝试关闭您所知道的所有套接字和连接,并确保您的应用程序完全终止。还要检查是否有另一个由您的程序启动的进程。


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