异常:java.net.BindException: Address already in use: JVM_Bind

  • Post author:
  • Post category:java

异常现象

为了在本地测试socket服务端,写了一个socket客户端,之前一直是可以用的,某天突然发现在启动sokcet客户端时一直启动不了,报错如下:

错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 8011; nested exception is: 
	java.net.BindException: Address already in use: JVM_Bind

异常分析

根据错误提示是8011端口被占用,在系统命令窗口输入:netstat -ano,查看8011确实是被占用:
在这里插入图片描述
其中5522端口是socket服务端的端口,并且使用5522端口和8011端口的是同一个PID:7836。
继续输入:netstat -ano|findstr “7836”,查看7836对应的信息:
在这里插入图片描述
继续输入tasklist|findstr “7836”,回车,查看是哪个进程或者程序占用了5522和8011端口,结果是:javaw.exe
在这里插入图片描述
javaw.exe是jdk中的带的一个程序。
输入命令:taskkill /F /pid 7836,可以看到进程7836已关闭,并且socket服务端也停止。
在这里插入图片描述
经过多次重试,发现每次启动socket服务端,socket服务端的端口5522对应的线程下都包含一个8011端口。
考虑到代码中没有使用8011端口,怀疑是不是Eclipse的问题,故在IDEA中导入项目,运行没有报错。比对了一下Eclipse和IDEA依赖的环境,发现:IDEA配置的JDK是jdk1.8.0_192,而Eclipse中配置的jdk1.8.0_73。
查看Eclipse中配置的JDK:
在这里插入图片描述
把jdk1.8.0_192添加进去并设成默认,重新启动项目没有报错。

分析了一下,产生这种异常的原因,可能是由于特定Eclipse的版本bug导致的。

Luna Service Release 1 (4.4.1)

Eclipse 版本信息:
Version: Luna Service Release 1 (4.4.1)
Build id: 20140925-1800

1:前提条件都是:64位系统安装的64位JDK jdk1.8.0_192,32位版本Eclipse启动时配置的32位JDKjdk1.8.0_73

1.1:项目编译配置的是32位JDKjdk1.8.0_73,启动正常。
在这里插入图片描述
1.2:项目编译配置的是64位JDKjdk1.8.0_192,启动正常。
在这里插入图片描述

2:前提条件都是:64位系统安装的32位JDK jdk1.8.0_73,32位版本Eclipse启动时配置的32位JDKjdk1.8.0_73

2.1:项目编译配置的是32位JDKjdk1.8.0_73,启动正常。

2.2:项目编译配置的是64位JDKjdk1.8.0_192,启动正常。

Oxygen.3 Release (4.7.3)

Eclipse 版本信息:
Version: Oxygen.3 Release (4.7.3)
Build id: 20180308-1800

1:前提条件都是:64位系统安装的64位JDK jdk1.8.0_192,32位版本Eclipse启动时配置的32位JDKjdk1.8.0_73

1.1:项目编译配置的也是32位JDKjdk1.8.0_73,启动报错:
在这里插入图片描述
1.2:项目编译配置的是64位JDKjdk1.8.0_192,启动正常:
在这里插入图片描述
2:前提条件都是:64位系统安装的32位JDK jdk1.8.0_73,32位版本Eclipse启动时配置的32位JDKjdk1.8.0_73

2.1:项目编译配置的是32位JDKjdk1.8.0_73,启动报错:
在这里插入图片描述

2.2:项目编译配置的是64位JDKjdk1.8.0_192,启动正常。

2019-06 (4.12.0)

Eclipse 版本信息:
Version: 2019-06 (4.12.0)
Build id: 20190614-1200

1:前提条件都是:64位系统安装的64位JDK jdk1.8.0_192,64位版本Eclipse启动时使用的默认配置的64位JDKjdk1.8.0_192

1.1:项目编译配置的也是32位JDKjdk1.8.0_73,启动正常。

1.2:项目编译配置的是64位JDKjdk1.8.0_192,启动正常。

2:前提条件都是:64位系统安装的32位JDK jdk1.8.0_73,64位版本Eclipse启动时配置的64位JDKjdk1.8.0_192

2.1:项目编译配置的是32位JDKjdk1.8.0_73,启动正常。

2.2:项目编译配置的是64位JDKjdk1.8.0_192,启动正常。

解决办法

更换出现异常的Eclipse的版本,同时最好64系统安装64JDK,并且使用64位版本的Eclipse。


版权声明:本文为bbc2005原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。